Skip to content

Commit 26d1982

Browse files
committed
lib/nmi_backtrace: Serialize even messages about idle CPUs
The commit 55d6af1 ("lib/nmi_backtrace: explicitly serialize banner and regs") serialized backtraces from more CPUs using the re-entrant printk_printk_cpu lock. It was a preparation step for removing the obsolete nmi_safe buffers. The single-line messages about idle CPUs were not serialized against other CPUs and might appear in the middle of backtrace from another CPU, for example: [56394.590068] NMI backtrace for cpu 2 [56394.590069] CPU: 2 PID: 444 Comm: systemd-journal Not tainted 5.14.0-rc1-default+ #268 [56394.590071] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.12.0-59-gc9ba527-rebuilt.opensuse.org 04/01/2014 [56394.590072] RIP: 0010:lock_is_held_type+0x0/0x120 [56394.590071] NMI backtrace for cpu 0 skipped: idling at native_safe_halt+0xb/0x10 [56394.590076] Code: a2 38 ff 0f 0b 8b 44 24 04 eb bd 48 8d ... [56394.590077] RSP: 0018:ffffab02c07c7e68 EFLAGS: 00000246 [56394.590079] RAX: 0000000000000000 RBX: ffff9a7bc0ec8a40 RCX: ffffffffaab8eb40 It might cause confusion what CPU the following lines belongs to and whether the backtraces are really serialized. Prevent the confusion and serialize also the single line message against other CPUs. Fixes: 55d6af1 ("lib/nmi_backtrace: explicitly serialize banner and regs") Reviewed-by: John Ogness <[email protected]> Reviewed-by: Sergey Senozhatsky <[email protected]> Signed-off-by: Petr Mladek <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 8d909b2 commit 26d1982

File tree

1 file changed

+6
-6
lines changed

1 file changed

+6
-6
lines changed

lib/nmi_backtrace.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -89,22 +89,22 @@ bool nmi_cpu_backtrace(struct pt_regs *regs)
8989
unsigned long flags;
9090

9191
if (cpumask_test_cpu(cpu, to_cpumask(backtrace_mask))) {
92+
/*
93+
* Allow nested NMI backtraces while serializing
94+
* against other CPUs.
95+
*/
96+
printk_cpu_lock_irqsave(flags);
9297
if (!READ_ONCE(backtrace_idle) && regs && cpu_in_idle(instruction_pointer(regs))) {
9398
pr_warn("NMI backtrace for cpu %d skipped: idling at %pS\n",
9499
cpu, (void *)instruction_pointer(regs));
95100
} else {
96-
/*
97-
* Allow nested NMI backtraces while serializing
98-
* against other CPUs.
99-
*/
100-
printk_cpu_lock_irqsave(flags);
101101
pr_warn("NMI backtrace for cpu %d\n", cpu);
102102
if (regs)
103103
show_regs(regs);
104104
else
105105
dump_stack();
106-
printk_cpu_unlock_irqrestore(flags);
107106
}
107+
printk_cpu_unlock_irqrestore(flags);
108108
cpumask_clear_cpu(cpu, to_cpumask(backtrace_mask));
109109
return true;
110110
}

0 commit comments

Comments
 (0)