aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Cornwall <jay@jcornwall.me>2015-09-16 15:10:03 -0400
committerJoerg Roedel <jroedel@suse.de>2015-10-15 10:13:07 -0400
commitd14f6fced5f9360edca5a1325ddb7077aab1203b (patch)
tree316e2d46b4987b04d6a8a6c7aae18bdef9fbc7c9
parent5adad9915472e180712030d730cdc476c6f8a60b (diff)
iommu/amd: Fix BUG when faulting a PROT_NONE VMA
handle_mm_fault indirectly triggers a BUG in do_numa_page when given a VMA without read/write/execute access. Check this condition in do_fault. do_fault -> handle_mm_fault -> handle_pte_fault -> do_numa_page mm/memory.c 3147 static int do_numa_page(struct mm_struct *mm, struct vm_area_struct *vma, .... 3159 /* A PROT_NONE fault should not end up here */ 3160 BUG_ON(!(vma->vm_flags & (VM_READ | VM_EXEC | VM_WRITE))); Signed-off-by: Jay Cornwall <jay@jcornwall.me> Cc: <stable@vger.kernel.org> # v4.1+ Signed-off-by: Joerg Roedel <jroedel@suse.de>
-rw-r--r--drivers/iommu/amd_iommu_v2.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/iommu/amd_iommu_v2.c b/drivers/iommu/amd_iommu_v2.c
index 1131664b918b..d21d4edf7236 100644
--- a/drivers/iommu/amd_iommu_v2.c
+++ b/drivers/iommu/amd_iommu_v2.c
@@ -516,6 +516,13 @@ static void do_fault(struct work_struct *work)
516 goto out; 516 goto out;
517 } 517 }
518 518
519 if (!(vma->vm_flags & (VM_READ | VM_EXEC | VM_WRITE))) {
520 /* handle_mm_fault would BUG_ON() */
521 up_read(&mm->mmap_sem);
522 handle_fault_error(fault);
523 goto out;
524 }
525
519 ret = handle_mm_fault(mm, vma, address, write); 526 ret = handle_mm_fault(mm, vma, address, write);
520 if (ret & VM_FAULT_ERROR) { 527 if (ret & VM_FAULT_ERROR) {
521 /* failed to service fault */ 528 /* failed to service fault */