diff options
-rw-r--r-- | xen/arch/x86/crash.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/xen/arch/x86/crash.c b/xen/arch/x86/crash.c index 0a807d1089..4ef379b57f 100644 --- a/xen/arch/x86/crash.c +++ b/xen/arch/x86/crash.c @@ -22,6 +22,7 @@ #include <xen/perfc.h> #include <xen/kexec.h> #include <xen/sched.h> +#include <xen/keyhandler.h> #include <public/xen.h> #include <asm/shared.h> #include <asm/hvm/support.h> @@ -30,7 +31,7 @@ #include <xen/iommu.h> #include <asm/hpet.h> -static atomic_t waiting_for_crash_ipi; +static cpumask_t waiting_to_crash; static unsigned int crashing_cpu; static DEFINE_PER_CPU_READ_MOSTLY(bool_t, crash_save_done); @@ -65,7 +66,7 @@ void __attribute__((noreturn)) do_nmi_crash(struct cpu_user_regs *regs) __stop_this_cpu(); this_cpu(crash_save_done) = 1; - atomic_dec(&waiting_for_crash_ipi); + cpumask_clear_cpu(cpu, &waiting_to_crash); } /* Poor mans self_nmi(). __stop_this_cpu() has reverted the LAPIC @@ -122,7 +123,7 @@ static void nmi_shootdown_cpus(void) crashing_cpu = cpu; local_irq_count(crashing_cpu) = 0; - atomic_set(&waiting_for_crash_ipi, num_online_cpus() - 1); + cpumask_andnot(&waiting_to_crash, &cpu_online_map, cpumask_of(cpu)); /* Change NMI trap handlers. Non-crashing pcpus get nmi_crash which * invokes do_nmi_crash (above), which cause them to write state and @@ -162,12 +163,22 @@ static void nmi_shootdown_cpus(void) smp_send_nmi_allbutself(); msecs = 1000; /* Wait at most a second for the other cpus to stop */ - while ( (atomic_read(&waiting_for_crash_ipi) > 0) && msecs ) + while ( !cpumask_empty(&waiting_to_crash) && msecs ) { mdelay(1); msecs--; } + /* Leave a hint of how well we did trying to shoot down the other cpus */ + if ( cpumask_empty(&waiting_to_crash) ) + printk("Shot down all CPUs\n"); + else + { + cpulist_scnprintf(keyhandler_scratch, sizeof keyhandler_scratch, + &waiting_to_crash); + printk("Failed to shoot down CPUs {%s}\n", keyhandler_scratch); + } + /* Crash shutdown any IOMMU functionality as the crashdump kernel is not * happy when booting if interrupt/dma remapping is still enabled */ iommu_crash_shutdown(); |