Skip to content

Commit

Permalink
lib/nmi_backtrace: explicitly serialize banner and regs
Browse files Browse the repository at this point in the history
Currently the nmi_backtrace is serialized against other CPUs because
the messages are sent to the NMI buffers. Once these buffers are
removed, only the dumped stack will be serialized against other CPUs
(via the printk_cpu_lock).

Also serialize the nmi_backtrace banner and regs using the
printk_cpu_lock so that per-CPU serialization will be preserved even
after the NMI buffers are removed.

Signed-off-by: John Ogness <john.ogness@linutronix.de>
Reviewed-by: Petr Mladek <pmladek@suse.com>
Signed-off-by: Petr Mladek <pmladek@suse.com>
Link: https://lore.kernel.org/r/20210715193359.25946-2-john.ogness@linutronix.de
  • Loading branch information
jogness authored and pmladek committed Jul 26, 2021
1 parent 65090f3 commit 55d6af1
Showing 1 changed file with 7 additions and 0 deletions.
7 changes: 7 additions & 0 deletions lib/nmi_backtrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,17 +92,24 @@ module_param(backtrace_idle, bool, 0644);
bool nmi_cpu_backtrace(struct pt_regs *regs)
{
int cpu = smp_processor_id();
unsigned long flags;

if (cpumask_test_cpu(cpu, to_cpumask(backtrace_mask))) {
if (!READ_ONCE(backtrace_idle) && regs && cpu_in_idle(instruction_pointer(regs))) {
pr_warn("NMI backtrace for cpu %d skipped: idling at %pS\n",
cpu, (void *)instruction_pointer(regs));
} else {
/*
* Allow nested NMI backtraces while serializing
* against other CPUs.
*/
printk_cpu_lock_irqsave(flags);
pr_warn("NMI backtrace for cpu %d\n", cpu);
if (regs)
show_regs(regs);
else
dump_stack();
printk_cpu_unlock_irqrestore(flags);
}
cpumask_clear_cpu(cpu, to_cpumask(backtrace_mask));
return true;
Expand Down

0 comments on commit 55d6af1

Please sign in to comment.