In the original patch solution, when a UCR-type DRAM error occurs, the flow does not enter do_machine_check->mce_panic; instead, it exits after executing do_machine_check and continues with the irqentry_exit_to_user_mode function. This flow triggers a schedule call. Since irqentry_nmi_enter calls __preempt_count_add(NMI_OFFSET + HARDIRQ_OFFSET), if a schedule occurs without executing irqentry_nmi_exit, the system will call the preempt_disable() function. Then, __schedule will call schedule_debug or determine in_atomic_preempt_off() to be true, leading to __schedule_bug and reporting the following error: BUG: scheduling while atomic:…… Therefore, it is necessary to adjust the position of irqentry_nmi_enter.
The PR Link: https://gitee.com/anolis/cloud-kernel/pulls/4064