arm: mm: drop VM_FAULT_BADMAP/VM_FAULT_BADACCESS
authorKefeng Wang <wangkefeng.wang@huawei.com>
Thu, 11 Apr 2024 13:09:25 +0000 (21:09 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 6 May 2024 00:53:32 +0000 (17:53 -0700)
If bad map or access, directly set code to SEGV_MAPRR or SEGV_ACCERR, also
set fault to 0 and goto error handling, which make us to drop the arch's
special vm fault reason.

[akpm@linux-foundation.org: coding-style cleanups]
Link: https://lkml.kernel.org/r/20240411130925.73281-3-wangkefeng.wang@huawei.com
Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
Cc: Aishwarya TCV <aishwarya.tcv@arm.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Cristian Marussi <cristian.marussi@arm.com>
Cc: Mark Brown <broonie@kernel.org>
Cc: Russell King <linux@armlinux.org.uk>
Cc: Will Deacon <will@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
arch/arm/mm/fault.c

index 5c4b417e24f9ed31561ca886159285f51c595151..bf07afdb2dd9e18ad083ed9d0d8938d8017c7488 100644 (file)
@@ -226,9 +226,6 @@ void do_bad_area(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
 }
 
 #ifdef CONFIG_MMU
-#define VM_FAULT_BADMAP                ((__force vm_fault_t)0x010000)
-#define VM_FAULT_BADACCESS     ((__force vm_fault_t)0x020000)
-
 static inline bool is_permission_fault(unsigned int fsr)
 {
        int fs = fsr_fs(fsr);
@@ -295,7 +292,8 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
        if (!(vma->vm_flags & vm_flags)) {
                vma_end_read(vma);
                count_vm_vma_lock_event(VMA_LOCK_SUCCESS);
-               fault = VM_FAULT_BADACCESS;
+               fault = 0;
+               code = SEGV_ACCERR;
                goto bad_area;
        }
        fault = handle_mm_fault(vma, addr, flags | FAULT_FLAG_VMA_LOCK, regs);
@@ -321,7 +319,8 @@ lock_mmap:
 retry:
        vma = lock_mm_and_find_vma(mm, addr, regs);
        if (unlikely(!vma)) {
-               fault = VM_FAULT_BADMAP;
+               fault = 0;
+               code = SEGV_MAPERR;
                goto bad_area;
        }
 
@@ -329,10 +328,14 @@ retry:
         * ok, we have a good vm_area for this memory access, check the
         * permissions on the VMA allow for the fault which occurred.
         */
-       if (!(vma->vm_flags & vm_flags))
-               fault = VM_FAULT_BADACCESS;
-       else
-               fault = handle_mm_fault(vma, addr & PAGE_MASK, flags, regs);
+       if (!(vma->vm_flags & vm_flags)) {
+               mmap_read_unlock(mm);
+               fault = 0;
+               code = SEGV_ACCERR;
+               goto bad_area;
+       }
+
+       fault = handle_mm_fault(vma, addr & PAGE_MASK, flags, regs);
 
        /* If we need to retry but a fatal signal is pending, handle the
         * signal first. We do not need to release the mmap_lock because
@@ -358,12 +361,11 @@ retry:
        mmap_read_unlock(mm);
 done:
 
-       /*
-        * Handle the "normal" case first - VM_FAULT_MAJOR
-        */
-       if (likely(!(fault & (VM_FAULT_ERROR | VM_FAULT_BADMAP | VM_FAULT_BADACCESS))))
+       /* Handle the "normal" case first */
+       if (likely(!(fault & VM_FAULT_ERROR)))
                return 0;
 
+       code = SEGV_MAPERR;
 bad_area:
        /*
         * If we are in kernel mode at this point, we
@@ -395,8 +397,6 @@ bad_area:
                 * isn't in our memory map..
                 */
                sig = SIGSEGV;
-               code = fault == VM_FAULT_BADACCESS ?
-                       SEGV_ACCERR : SEGV_MAPERR;
        }
 
        __do_user_fault(addr, fsr, sig, code, regs);