Message ID | 20240731032627.59696-1-qiaozhe@iscas.ac.cn (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | riscv/mm: Add handling for VM_FAULT_SIGSEGV in mm_fault_error() | expand |
Hi Zhe, On Wed, Jul 31, 2024 at 5:26 AM Zhe Qiao <qiaozhe@iscas.ac.cn> wrote: > > Add processing for VM_CAULT_SIGSEGV to mm_fault_error () to avoid > direct execution of BUG(). Sorry to bother you again, but since there is a typo (s/VM_CAULT_SIGSEGV/VM_FAULT_SIGSEGV), do you mind rephrasing the commit log like this (or similar)? "Handle VM_FAULT_SIGSEGV in the page fault path so that we correctly kill the process and we don't BUG() the kernel." > > Fixes: 07037db5d479 ("RISC-V: Paging and MMU") > Signed-off-by: Zhe Qiao <qiaozhe@iscas.ac.cn> > --- > arch/riscv/mm/fault.c | 17 +++++++++-------- > 1 file changed, 9 insertions(+), 8 deletions(-) > > diff --git a/arch/riscv/mm/fault.c b/arch/riscv/mm/fault.c > index 5224f3733802..a9f2b4af8f3f 100644 > --- a/arch/riscv/mm/fault.c > +++ b/arch/riscv/mm/fault.c > @@ -61,26 +61,27 @@ static inline void no_context(struct pt_regs *regs, unsigned long addr) > > static inline void mm_fault_error(struct pt_regs *regs, unsigned long addr, vm_fault_t fault) > { > + if (!user_mode(regs)) { > + no_context(regs, addr); > + return; > + } > + > if (fault & VM_FAULT_OOM) { > /* > * We ran out of memory, call the OOM killer, and return the userspace > * (which will retry the fault, or kill us if we got oom-killed). > */ > - if (!user_mode(regs)) { > - no_context(regs, addr); > - return; > - } > pagefault_out_of_memory(); > return; > } else if (fault & (VM_FAULT_SIGBUS | VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE)) { > /* Kernel mode? Handle exceptions or die */ > - if (!user_mode(regs)) { > - no_context(regs, addr); > - return; > - } > do_trap(regs, SIGBUS, BUS_ADRERR, addr); > return; > + } else if (fault & VM_FAULT_SIGSEGV) { > + do_trap(regs, SIGSEGV, SEGV_MAPERR, addr); > + return; > } > + > BUG(); > } > > -- > 2.43.0 > That's a very good catch, good job! You can add: Reviewed-by: Alexandre Ghiti <alexghiti@rivosinc.com> Thanks, Alex
diff --git a/arch/riscv/mm/fault.c b/arch/riscv/mm/fault.c index 5224f3733802..a9f2b4af8f3f 100644 --- a/arch/riscv/mm/fault.c +++ b/arch/riscv/mm/fault.c @@ -61,26 +61,27 @@ static inline void no_context(struct pt_regs *regs, unsigned long addr) static inline void mm_fault_error(struct pt_regs *regs, unsigned long addr, vm_fault_t fault) { + if (!user_mode(regs)) { + no_context(regs, addr); + return; + } + if (fault & VM_FAULT_OOM) { /* * We ran out of memory, call the OOM killer, and return the userspace * (which will retry the fault, or kill us if we got oom-killed). */ - if (!user_mode(regs)) { - no_context(regs, addr); - return; - } pagefault_out_of_memory(); return; } else if (fault & (VM_FAULT_SIGBUS | VM_FAULT_HWPOISON | VM_FAULT_HWPOISON_LARGE)) { /* Kernel mode? Handle exceptions or die */ - if (!user_mode(regs)) { - no_context(regs, addr); - return; - } do_trap(regs, SIGBUS, BUS_ADRERR, addr); return; + } else if (fault & VM_FAULT_SIGSEGV) { + do_trap(regs, SIGSEGV, SEGV_MAPERR, addr); + return; } + BUG(); }
Add processing for VM_CAULT_SIGSEGV to mm_fault_error () to avoid direct execution of BUG(). Fixes: 07037db5d479 ("RISC-V: Paging and MMU") Signed-off-by: Zhe Qiao <qiaozhe@iscas.ac.cn> --- arch/riscv/mm/fault.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-)