arm64/mm: Refactor __do_page_fault()
authorAnshuman Khandual <anshuman.khandual@arm.com>
Fri, 7 Jun 2019 09:13:06 +0000 (14:43 +0530)
committerCatalin Marinas <catalin.marinas@arm.com>
Fri, 7 Jun 2019 13:35:12 +0000 (14:35 +0100)
__do_page_fault() is over complicated with multiple goto statements. This
cleans up the code flow and while there drops local variable vm_fault_t.

Reviewed-by: Mark Rutland <Mark.rutland@arm.com>
Signed-off-by: Anshuman Khandual <anshuman.khandual@arm.com>
Cc: Will Deacon <will.deacon@arm.com>
Cc: James Morse <james.morse@arm.com>
Cc: Andrey Konovalov <andreyknvl@google.com>
Cc: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/mm/fault.c

index 765b5eb601caf5c4bee474bb309645ac0d629575..582061dec89fae077d516c2366349bae917f6c7d 100644 (file)
@@ -397,37 +397,29 @@ 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.
         */
-good_area:
+       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;
+       }
+
        /*
         * Check that the permissions on the VMA allow for the fault which
         * occurred.
         */
-       if (!(vma->vm_flags & vm_flags)) {
-               fault = VM_FAULT_BADACCESS;
-               goto out;
-       }
-
+       if (!(vma->vm_flags & vm_flags))
+               return VM_FAULT_BADACCESS;
        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)