Commit 492e7459 authored by Joerg Roedel's avatar Joerg Roedel

iommu/amd: Cleanup error handling in do_fault()

Get rid of the three error paths that look the same and move
error handling to a single place.
Reviewed-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
Acked-By: default avatarDavid Woodhouse <David.Woodhouse@intel.com>
Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent 43c0ea20
...@@ -514,10 +514,10 @@ static void do_fault(struct work_struct *work) ...@@ -514,10 +514,10 @@ static void do_fault(struct work_struct *work)
{ {
struct fault *fault = container_of(work, struct fault, work); struct fault *fault = container_of(work, struct fault, work);
struct vm_area_struct *vma; struct vm_area_struct *vma;
int ret = VM_FAULT_ERROR;
unsigned int flags = 0; unsigned int flags = 0;
struct mm_struct *mm; struct mm_struct *mm;
u64 address; u64 address;
int ret;
mm = fault->state->mm; mm = fault->state->mm;
address = fault->address; address = fault->address;
...@@ -529,31 +529,23 @@ static void do_fault(struct work_struct *work) ...@@ -529,31 +529,23 @@ static void do_fault(struct work_struct *work)
down_read(&mm->mmap_sem); down_read(&mm->mmap_sem);
vma = find_extend_vma(mm, address); vma = find_extend_vma(mm, address);
if (!vma || address < vma->vm_start) { if (!vma || address < vma->vm_start)
/* failed to get a vma in the right range */ /* failed to get a vma in the right range */
up_read(&mm->mmap_sem);
handle_fault_error(fault);
goto out; goto out;
}
/* Check if we have the right permissions on the vma */ /* Check if we have the right permissions on the vma */
if (access_error(vma, fault)) { if (access_error(vma, fault))
up_read(&mm->mmap_sem);
handle_fault_error(fault);
goto out; goto out;
}
ret = handle_mm_fault(mm, vma, address, flags); ret = handle_mm_fault(mm, vma, address, flags);
if (ret & VM_FAULT_ERROR) {
/* failed to service fault */
up_read(&mm->mmap_sem);
handle_fault_error(fault);
goto out;
}
out:
up_read(&mm->mmap_sem); up_read(&mm->mmap_sem);
out: if (ret & VM_FAULT_ERROR)
/* failed to service fault */
handle_fault_error(fault);
finish_pri_tag(fault->dev_state, fault->state, fault->tag); finish_pri_tag(fault->dev_state, fault->state, fault->tag);
put_pasid_state(fault->state); put_pasid_state(fault->state);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment