__do_page_fault() is over complicated with multiple goto statements. This
cleans up code flow and while there drops the vm_fault_t argument.

Signed-off-by: Anshuman Khandual <[email protected]>
Cc: Catalin Marinas <[email protected]>
Cc: Will Deacon <[email protected]>
Cc: Mark Rutland <[email protected]>
Cc: James Morse <[email protected]> 
Cc: Andrey Konovalov <[email protected]>
---
 arch/arm64/mm/fault.c | 38 ++++++++++++++++----------------------
 1 file changed, 16 insertions(+), 22 deletions(-)

diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c
index 170c71f..a53a30e 100644
--- a/arch/arm64/mm/fault.c
+++ b/arch/arm64/mm/fault.c
@@ -397,37 +397,31 @@ static void do_bad_area(unsigned long addr, unsigned int 
esr, struct pt_regs *re
 static vm_fault_t __do_page_fault(struct mm_struct *mm, unsigned long addr,
                           unsigned int mm_flags, unsigned long vm_flags)
 {
-       struct vm_area_struct *vma;
-       vm_fault_t fault;
+       struct vm_area_struct *vma = find_vma(mm, addr);
 
-       vma = find_vma(mm, addr);
-       fault = VM_FAULT_BADMAP;
        if (unlikely(!vma))
-               goto out;
-       if (unlikely(vma->vm_start > addr))
-               goto check_stack;
+               return VM_FAULT_BADMAP;
 
        /*
-        * Ok, we have a good vm_area for this memory access, so we can handle
-        * it.
+        * Check if the VMA has got the required permssion with respect
+        * to the access fault here.
         */
-good_area:
+       if (!(vma->vm_flags & vm_flags))
+               return VM_FAULT_BADACCESS;
+
        /*
-        * Check that the permissions on the VMA allow for the fault which
-        * occurred.
+        * There is a valid VMA for this access. But before proceeding
+        * make sure that it has required flags if there is an attempt
+        * to expand the stack downwards.
         */
-       if (!(vma->vm_flags & vm_flags)) {
-               fault = VM_FAULT_BADACCESS;
-               goto out;
-       }
+       if (unlikely(vma->vm_start > addr)) {
+               if (!(vma->vm_flags & VM_GROWSDOWN))
+                       return VM_FAULT_BADMAP;
 
+               if (expand_stack(vma, addr))
+                       return VM_FAULT_BADMAP;
+       }
        return handle_mm_fault(vma, addr & PAGE_MASK, mm_flags);
-
-check_stack:
-       if (vma->vm_flags & VM_GROWSDOWN && !expand_stack(vma, addr))
-               goto good_area;
-out:
-       return fault;
 }
 
 static bool is_el0_instruction_abort(unsigned int esr)
-- 
2.7.4

Reply via email to