hulk inclusion category: feature bugzilla: https://atomgit.com/openeuler/kernel/issues/8489 -------------------------------- Currently, UCE in kernel context (!current->mm) leads to direct panic. This patch adds recovery path support for kernel-context UCE, allowing system to recover instead of panic when recovery function is available. Signed-off-by: Qi Xi <xiqi2@huawei.com> --- arch/arm64/mm/fault.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index 96bfdade877a..8ad7b7626a60 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -842,7 +842,7 @@ static int do_sea(unsigned long addr, unsigned int esr, struct pt_regs *regs) #ifdef CONFIG_UCE_KERNEL_RECOVERY int idx; - if (!current->mm || !kernel_access_sea_recovery) { + if (!kernel_access_sea_recovery) { pr_emerg("UCE: kernel recovery %d, %s-%d is %s-thread.\n", kernel_access_sea_recovery, current->comm, current->pid, @@ -853,6 +853,14 @@ static int do_sea(unsigned long addr, unsigned int esr, struct pt_regs *regs) idx = is_in_kernel_recovery(esr, regs); if (idx >= 0 && idx < UCE_KER_REC_NUM) { + if (!current->mm) { + set_thread_flag(TIF_UCE_KERNEL_RECOVERY); + if (reco_info[idx].flags & KR_SET_TASK_STATE) + current->flags |= PF_UCE_KERNEL_RECOVERY; + regs->pc = (unsigned long)reco_info[idx].fn; + return 0; + } + set_thread_flag(TIF_UCE_KERNEL_RECOVERY); clear_siginfo(&info); info.si_signo = inf->sig; -- 2.33.0