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.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>
This commit is contained in:
parent
eebb5181a0
commit
e901617462
@ -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)
|
|||||||
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 @@ lock_mmap:
|
|||||||
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 @@ retry:
|
|||||||
* 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 @@ retry:
|
|||||||
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 @@ bad_area:
|
|||||||
* 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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user