|
@@ -28,10 +28,20 @@ u64 hw_nmi_get_sample_period(void)
|
|
|
/* For reliability, we're prepared to waste bits here. */
|
|
|
static DECLARE_BITMAP(backtrace_mask, NR_CPUS) __read_mostly;
|
|
|
|
|
|
+/* "in progress" flag of arch_trigger_all_cpu_backtrace */
|
|
|
+static unsigned long backtrace_flag;
|
|
|
+
|
|
|
void arch_trigger_all_cpu_backtrace(void)
|
|
|
{
|
|
|
int i;
|
|
|
|
|
|
+ if (test_and_set_bit(0, &backtrace_flag))
|
|
|
+ /*
|
|
|
+ * If there is already a trigger_all_cpu_backtrace() in progress
|
|
|
+ * (backtrace_flag == 1), don't output double cpu dump infos.
|
|
|
+ */
|
|
|
+ return;
|
|
|
+
|
|
|
cpumask_copy(to_cpumask(backtrace_mask), cpu_online_mask);
|
|
|
|
|
|
printk(KERN_INFO "sending NMI to all CPUs:\n");
|
|
@@ -43,6 +53,9 @@ void arch_trigger_all_cpu_backtrace(void)
|
|
|
break;
|
|
|
mdelay(1);
|
|
|
}
|
|
|
+
|
|
|
+ clear_bit(0, &backtrace_flag);
|
|
|
+ smp_mb__after_clear_bit();
|
|
|
}
|
|
|
|
|
|
static int __kprobes
|