Merge tag 'docs-5.15' of git://git.lwn.net/linux
[linux-2.6-microblaze.git] / lib / nmi_backtrace.c
index 8abe187..f9e8900 100644 (file)
@@ -75,12 +75,6 @@ void nmi_trigger_cpumask_backtrace(const cpumask_t *mask,
                touch_softlockup_watchdog();
        }
 
-       /*
-        * Force flush any remote buffers that might be stuck in IRQ context
-        * and therefore could not run their irq_work.
-        */
-       printk_safe_flush();
-
        clear_bit_unlock(0, &backtrace_flag);
        put_cpu();
 }
@@ -92,8 +86,14 @@ 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))) {
+               /*
+                * Allow nested NMI backtraces while serializing
+                * against other CPUs.
+                */
+               printk_cpu_lock_irqsave(flags);
                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));
@@ -104,6 +104,7 @@ bool nmi_cpu_backtrace(struct pt_regs *regs)
                        else
                                dump_stack();
                }
+               printk_cpu_unlock_irqrestore(flags);
                cpumask_clear_cpu(cpu, to_cpumask(backtrace_mask));
                return true;
        }