Use new try_vma_locked_page_fault() helper to simplify code.
No functional change intended.

Signed-off-by: Kefeng Wang <wangkefeng.w...@huawei.com>
---
 arch/riscv/mm/fault.c | 38 +++++++++++++++-----------------------
 1 file changed, 15 insertions(+), 23 deletions(-)

diff --git a/arch/riscv/mm/fault.c b/arch/riscv/mm/fault.c
index 6ea2cce4cc17..13bc60370b5c 100644
--- a/arch/riscv/mm/fault.c
+++ b/arch/riscv/mm/fault.c
@@ -215,6 +215,16 @@ static inline bool access_error(unsigned long cause, 
struct vm_area_struct *vma)
        return false;
 }
 
+#ifdef CONFIG_PER_VMA_LOCK
+int arch_vma_check_access(struct vm_area_struct *vma,
+                         struct vm_locked_fault *vmlf)
+{
+       if (unlikely(access_error(vmlf->fault_code, vma)))
+               return -EINVAL;
+       return 0;
+}
+#endif
+
 /*
  * This routine handles page faults.  It determines the address and the
  * problem, and then passes it off to one of the appropriate routines.
@@ -228,6 +238,7 @@ void handle_page_fault(struct pt_regs *regs)
        unsigned int flags = FAULT_FLAG_DEFAULT;
        int code = SEGV_MAPERR;
        vm_fault_t fault;
+       struct vm_locked_fault vmlf;
 
        cause = regs->cause;
        addr = regs->badaddr;
@@ -283,35 +294,18 @@ void handle_page_fault(struct pt_regs *regs)
                flags |= FAULT_FLAG_WRITE;
        else if (cause == EXC_INST_PAGE_FAULT)
                flags |= FAULT_FLAG_INSTRUCTION;
-#ifdef CONFIG_PER_VMA_LOCK
-       if (!(flags & FAULT_FLAG_USER))
-               goto lock_mmap;
 
-       vma = lock_vma_under_rcu(mm, addr);
-       if (!vma)
-               goto lock_mmap;
-
-       if (unlikely(access_error(cause, vma))) {
-               vma_end_read(vma);
-               goto lock_mmap;
-       }
-
-       fault = handle_mm_fault(vma, addr, flags | FAULT_FLAG_VMA_LOCK, regs);
-       vma_end_read(vma);
-
-       if (!(fault & VM_FAULT_RETRY)) {
-               count_vm_vma_lock_event(VMA_LOCK_SUCCESS);
+       VM_LOCKED_FAULT_INIT(vmlf, mm, addr, flags, 0, regs, cause);
+       if (try_vma_locked_page_fault(&vmlf, &fault))
+               goto retry;
+       else if (!(fault | VM_FAULT_RETRY))
                goto done;
-       }
-       count_vm_vma_lock_event(VMA_LOCK_RETRY);
 
        if (fault_signal_pending(fault, regs)) {
                if (!user_mode(regs))
                        no_context(regs, addr);
                return;
        }
-lock_mmap:
-#endif /* CONFIG_PER_VMA_LOCK */
 
 retry:
        vma = lock_mm_and_find_vma(mm, addr, regs);
@@ -368,9 +362,7 @@ void handle_page_fault(struct pt_regs *regs)
 
        mmap_read_unlock(mm);
 
-#ifdef CONFIG_PER_VMA_LOCK
 done:
-#endif
        if (unlikely(fault & VM_FAULT_ERROR)) {
                tsk->thread.bad_cause = cause;
                mm_fault_error(regs, addr, fault);
-- 
2.27.0

Reply via email to