Commit e9016174 authored by Kefeng Wang's avatar Kefeng Wang Committed by Andrew Morton

arm: mm: drop VM_FAULT_BADMAP/VM_FAULT_BADACCESS

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.comSigned-off-by: default avatarKefeng 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: default avatarAndrew Morton <akpm@linux-foundation.org>
parent eebb5181
...@@ -226,9 +226,6 @@ void do_bad_area(unsigned long addr, unsigned int fsr, struct pt_regs *regs) ...@@ -226,9 +226,6 @@ void do_bad_area(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
} }
#ifdef CONFIG_MMU #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) static inline bool is_permission_fault(unsigned int fsr)
{ {
int fs = fsr_fs(fsr); int fs = fsr_fs(fsr);
...@@ -295,7 +292,8 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) ...@@ -295,7 +292,8 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
if (!(vma->vm_flags & vm_flags)) { if (!(vma->vm_flags & vm_flags)) {
vma_end_read(vma); vma_end_read(vma);
count_vm_vma_lock_event(VMA_LOCK_SUCCESS); count_vm_vma_lock_event(VMA_LOCK_SUCCESS);
fault = VM_FAULT_BADACCESS; fault = 0;
code = SEGV_ACCERR;
goto bad_area; goto bad_area;
} }
fault = handle_mm_fault(vma, addr, flags | FAULT_FLAG_VMA_LOCK, regs); fault = handle_mm_fault(vma, addr, flags | FAULT_FLAG_VMA_LOCK, regs);
...@@ -321,7 +319,8 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) ...@@ -321,7 +319,8 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
retry: retry:
vma = lock_mm_and_find_vma(mm, addr, regs); vma = lock_mm_and_find_vma(mm, addr, regs);
if (unlikely(!vma)) { if (unlikely(!vma)) {
fault = VM_FAULT_BADMAP; fault = 0;
code = SEGV_MAPERR;
goto bad_area; goto bad_area;
} }
...@@ -329,10 +328,14 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) ...@@ -329,10 +328,14 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
* ok, we have a good vm_area for this memory access, check the * ok, we have a good vm_area for this memory access, check the
* permissions on the VMA allow for the fault which occurred. * permissions on the VMA allow for the fault which occurred.
*/ */
if (!(vma->vm_flags & vm_flags)) if (!(vma->vm_flags & vm_flags)) {
fault = VM_FAULT_BADACCESS; mmap_read_unlock(mm);
else fault = 0;
fault = handle_mm_fault(vma, addr & PAGE_MASK, flags, regs); 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 /* 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 * signal first. We do not need to release the mmap_lock because
...@@ -358,12 +361,11 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) ...@@ -358,12 +361,11 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
mmap_read_unlock(mm); mmap_read_unlock(mm);
done: done:
/* /* Handle the "normal" case first */
* Handle the "normal" case first - VM_FAULT_MAJOR if (likely(!(fault & VM_FAULT_ERROR)))
*/
if (likely(!(fault & (VM_FAULT_ERROR | VM_FAULT_BADMAP | VM_FAULT_BADACCESS))))
return 0; return 0;
code = SEGV_MAPERR;
bad_area: bad_area:
/* /*
* If we are in kernel mode at this point, we * If we are in kernel mode at this point, we
...@@ -395,8 +397,6 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs) ...@@ -395,8 +397,6 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
* isn't in our memory map.. * isn't in our memory map..
*/ */
sig = SIGSEGV; sig = SIGSEGV;
code = fault == VM_FAULT_BADACCESS ?
SEGV_ACCERR : SEGV_MAPERR;
} }
__do_user_fault(addr, fsr, sig, code, regs); __do_user_fault(addr, fsr, sig, code, regs);
......
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