From e16669cdf081f1c06afd2741e4c836633b78d0aa Mon Sep 17 00:00:00 2001 From: Dongdong Deng Date: Tue, 4 Jan 2011 22:38:08 -0500 Subject: [PATCH] --- yaml --- r: 223972 b: refs/heads/master c: 554ec063982752e9a569ab9189eeffa3d96731b2 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/arch/x86/kernel/apic/hw_nmi.c | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index a034310e9d87..5453e1fb09bc 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 9ab181fa9ff73a38fccd0a4f1c40a38dfe62b535 +refs/heads/master: 554ec063982752e9a569ab9189eeffa3d96731b2 diff --git a/trunk/arch/x86/kernel/apic/hw_nmi.c b/trunk/arch/x86/kernel/apic/hw_nmi.c index 2b40a6045da2..72ec29e1ae06 100644 --- a/trunk/arch/x86/kernel/apic/hw_nmi.c +++ b/trunk/arch/x86/kernel/apic/hw_nmi.c @@ -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