aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xen/arch/x86/nmi.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/xen/arch/x86/nmi.c b/xen/arch/x86/nmi.c
index 77447107a0..c08f4303cd 100644
--- a/xen/arch/x86/nmi.c
+++ b/xen/arch/x86/nmi.c
@@ -94,6 +94,11 @@ int nmi_active;
(P4_CCCR_OVF_PMI0|P4_CCCR_THRESHOLD(15)|P4_CCCR_COMPLEMENT| \
P4_CCCR_COMPARE|P4_CCCR_REQUIRED|P4_CCCR_ESCR_SELECT(4)|P4_CCCR_ENABLE)
+static void __init wait_for_nmis(void *p)
+{
+ mdelay((10*1000)/nmi_hz); /* wait 10 ticks */
+}
+
int __init check_nmi_watchdog (void)
{
static unsigned int __initdata prev_nmi_count[NR_CPUS];
@@ -107,7 +112,12 @@ int __init check_nmi_watchdog (void)
for ( cpu = 0; cpu < NR_CPUS; cpu++ )
prev_nmi_count[cpu] = nmi_count(cpu);
local_irq_enable();
- mdelay((10*1000)/nmi_hz); /* wait 10 ticks */
+
+ /* Wait for 10 ticks. Busy-wait on all CPUs: the LAPIC counter that
+ * the NMI watchdog uses only runs while the core's not halted */
+ if ( nmi_watchdog == NMI_LOCAL_APIC )
+ smp_call_function(wait_for_nmis, NULL, 0);
+ wait_for_nmis(NULL);
for ( cpu = 0; cpu < NR_CPUS; cpu++ )
{