On Fri, 28 Jan 2022 at 12:42, Tiezhu Yang <yangtiezhu@xxxxxxxxxxx> wrote: > > 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"); I agree this is worth fixing. But: Why can't the "panic_on_warn = 0" just be moved inside panic(), instead of copy-pasting this all over the place? I may be missing something obvious why this hasn't been done before... Thanks, -- Marco