diff options
Diffstat (limited to 'lib/nmi_backtrace.c')
-rw-r--r-- | lib/nmi_backtrace.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/lib/nmi_backtrace.c b/lib/nmi_backtrace.c index 4e8a30d1c22f..0bc0a3535a8a 100644 --- a/lib/nmi_backtrace.c +++ b/lib/nmi_backtrace.c | |||
@@ -86,9 +86,11 @@ void nmi_trigger_cpumask_backtrace(const cpumask_t *mask, | |||
86 | 86 | ||
87 | bool nmi_cpu_backtrace(struct pt_regs *regs) | 87 | bool nmi_cpu_backtrace(struct pt_regs *regs) |
88 | { | 88 | { |
89 | static arch_spinlock_t lock = __ARCH_SPIN_LOCK_UNLOCKED; | ||
89 | int cpu = smp_processor_id(); | 90 | int cpu = smp_processor_id(); |
90 | 91 | ||
91 | if (cpumask_test_cpu(cpu, to_cpumask(backtrace_mask))) { | 92 | if (cpumask_test_cpu(cpu, to_cpumask(backtrace_mask))) { |
93 | arch_spin_lock(&lock); | ||
92 | if (regs && cpu_in_idle(instruction_pointer(regs))) { | 94 | if (regs && cpu_in_idle(instruction_pointer(regs))) { |
93 | pr_warn("NMI backtrace for cpu %d skipped: idling at pc %#lx\n", | 95 | pr_warn("NMI backtrace for cpu %d skipped: idling at pc %#lx\n", |
94 | cpu, instruction_pointer(regs)); | 96 | cpu, instruction_pointer(regs)); |
@@ -99,6 +101,7 @@ bool nmi_cpu_backtrace(struct pt_regs *regs) | |||
99 | else | 101 | else |
100 | dump_stack(); | 102 | dump_stack(); |
101 | } | 103 | } |
104 | arch_spin_unlock(&lock); | ||
102 | cpumask_clear_cpu(cpu, to_cpumask(backtrace_mask)); | 105 | cpumask_clear_cpu(cpu, to_cpumask(backtrace_mask)); |
103 | return true; | 106 | return true; |
104 | } | 107 | } |