From: Ian.Campbell@xensource.com Date: Fri, 13 Jan 2006 14:09:39 +0000 (+0000) Subject: Ensure watchdog remains disabled unless enabled on the command line. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~16541^2~47 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=8ffaf9c238e61a5e435cf648f86f8ece042b8db9;p=xen.git Ensure watchdog remains disabled unless enabled on the command line. Bail out of setup_apic_nmi_watchdog() early if watchdog is not enabled. Is the watchdog is disabled then increment watchdog_disable_count to prevent it ever becoming enabled. Unconditionally call setup_apic_nmi_watchdog() from setup_local_APIC() so that the above is guaranteed to have occurred before the first call of watchdog_enable(). Signed-off-by: Ian Campbell --- diff --git a/xen/arch/x86/apic.c b/xen/arch/x86/apic.c index 7eb6000b37..f1a5f0b96d 100644 --- a/xen/arch/x86/apic.c +++ b/xen/arch/x86/apic.c @@ -451,8 +451,7 @@ void __init setup_local_APIC (void) printk("No ESR for 82489DX.\n"); } - if (nmi_watchdog == NMI_LOCAL_APIC) - setup_apic_nmi_watchdog(); + setup_apic_nmi_watchdog(); } /* diff --git a/xen/arch/x86/nmi.c b/xen/arch/x86/nmi.c index 6c969701a3..d2ccd4e7e4 100644 --- a/xen/arch/x86/nmi.c +++ b/xen/arch/x86/nmi.c @@ -31,6 +31,10 @@ #include unsigned int nmi_watchdog = NMI_NONE; +static spinlock_t watchdog_lock = SPIN_LOCK_UNLOCKED; +static unsigned int watchdog_disable_count = 1; +static unsigned int watchdog_on; + static unsigned int nmi_hz = HZ; static unsigned int nmi_perfctr_msr; /* the MSR to reset in NMI handler */ static unsigned int nmi_p4_cccr_val; @@ -310,8 +314,16 @@ void __pminit setup_apic_nmi_watchdog(void) { int cpu = smp_processor_id(); - if (!nmi_watchdog) - return; + if ( nmi_active < 0 ) + return; + + if ( !nmi_watchdog ) + { + /* Force the watchdog to always be disabled. */ + watchdog_disable_count++; + nmi_active = -1; + return; + } switch (boot_cpu_data.x86_vendor) { case X86_VENDOR_AMD: @@ -352,10 +364,6 @@ static unsigned int last_irq_sums [NR_CPUS], alert_counter [NR_CPUS]; -static spinlock_t watchdog_lock = SPIN_LOCK_UNLOCKED; -static unsigned int watchdog_disable_count = 1; -static unsigned int watchdog_on; - void watchdog_disable(void) { unsigned long flags;