--- zzzz-none-000/linux-2.6.39.4/arch/x86/kernel/apic/hw_nmi.c 2011-08-03 19:43:28.000000000 +0000 +++ puma6-atom-6490-729/linux-2.6.39.4/arch/x86/kernel/apic/hw_nmi.c 2021-11-10 13:38:14.000000000 +0000 @@ -32,8 +32,9 @@ /* "in progress" flag of arch_trigger_all_cpu_backtrace */ static unsigned long backtrace_flag; -void arch_trigger_all_cpu_backtrace(void) +static void __arch_trigger_all_cpu_backtrace(bool exclude_self) { + int this_cpu = get_cpu(); int i; if (test_and_set_bit(0, &backtrace_flag)) @@ -45,8 +46,14 @@ cpumask_copy(to_cpumask(backtrace_mask), cpu_online_mask); - printk(KERN_INFO "sending NMI to all CPUs:\n"); - apic->send_IPI_all(NMI_VECTOR); + printk(KERN_INFO "sending NMI to all %sCPUs:\n", + exclude_self ? "other " : ""); + if (exclude_self) { + cpumask_clear_cpu(this_cpu, to_cpumask(backtrace_mask)); + apic->send_IPI_allbutself(NMI_VECTOR); + } else { + apic->send_IPI_all(NMI_VECTOR); + } /* Wait for up to 10 seconds for all CPUs to do the backtrace */ for (i = 0; i < 10 * 1000; i++) { @@ -57,6 +64,19 @@ clear_bit(0, &backtrace_flag); smp_mb__after_clear_bit(); + + put_cpu(); +} + + +void arch_trigger_allbutself_cpu_backtrace(void) +{ + __arch_trigger_all_cpu_backtrace(true); +} + +void arch_trigger_all_cpu_backtrace(void) +{ + __arch_trigger_all_cpu_backtrace(false); } static int __kprobes