hulk inclusion category: feature bugzilla: https://atomgit.com/openeuler/kernel/issues/8386 ------------------------------------------ During do_sea, kernel will panic if no info is reported to kernel since apei_claim_sea failed. However, for user task, sig fault can be send to which can avoid kernel panic. Signed-off-by: Wupeng Ma <mawupeng1@huawei.com> --- arch/arm64/mm/fault.c | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index 69c8138f3e7ac..e1a54a195d7a1 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -847,8 +847,10 @@ static int do_bad(unsigned long far, unsigned long esr, struct pt_regs *regs) * Some processing deferred to task_work before ret_to_user(). */ static bool do_apei_claim_sea(unsigned long esr, struct pt_regs *regs, - unsigned long siaddr) + unsigned long siaddr, int sig, int code) { + int err; + if (user_mode(regs)) { if (!apei_claim_sea(regs)) return true; @@ -867,10 +869,21 @@ static bool do_apei_claim_sea(unsigned long esr, struct pt_regs *regs, if (!fixup_exception_me(regs)) return false; - if (apei_claim_sea(regs)) + err = apei_claim_sea(regs); + if (!err) return true; - return false; + pr_emerg("comm: %s pid: %d apei claim sea failed. addr: %#lx, esr: %#lx\n", + current->comm, current->pid, siaddr, esr); + + if (!current->mm) + return true; + + set_thread_esr(0, esr); + arm64_force_sig_fault(sig, code, siaddr, + "Uncorrected memory error on access to user memory\n"); + + return true; } static int do_sea(unsigned long far, unsigned long esr, struct pt_regs *regs) @@ -891,7 +904,7 @@ static int do_sea(unsigned long far, unsigned long esr, struct pt_regs *regs) } add_taint(TAINT_MACHINE_CHECK, LOCKDEP_STILL_OK); - if (do_apei_claim_sea(esr, regs, siaddr)) + if (do_apei_claim_sea(esr, regs, siaddr, inf->sig, inf->code)) return 0; arm64_notify_die(inf->name, regs, inf->sig, inf->code, siaddr, esr); -- 2.43.0