As done in the full WARN() handler, panic_on_warn needs to be cleared before calling panic() to avoid recursive panics. Signed-off-by: Tiezhu Yang <yangtiezhu@xxxxxxxxxxx> --- kernel/sched/core.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 848eaa0..f5b0886 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -5524,8 +5524,17 @@ static noinline void __schedule_bug(struct task_struct *prev) pr_err("Preemption disabled at:"); print_ip_sym(KERN_ERR, preempt_disable_ip); } - if (panic_on_warn) + + if (panic_on_warn) { + /* + * This thread may hit another WARN() in the panic path. + * Resetting this prevents additional WARN() from panicking the + * system on this thread. Other threads are blocked by the + * panic_mutex in panic(). + */ + panic_on_warn = 0; panic("scheduling while atomic\n"); + } dump_stack(); add_taint(TAINT_WARN, LOCKDEP_STILL_OK); -- 2.1.0