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;