Fixed wrong expression which enabled watchdogs even if nmi_watchdog kernel
parameter wasn't set. This regression got slightly introduced with commit
b7471c6da94d30d3deadc55986cc38d1ff57f9ca.
Introduced NMI_DISABLED (-1) which allows to switch the value of NMI_DEFAULT
without breaking the APIC NMI watchdog code (again).
Fixes:
   https://bugzilla.novell.com/show_bug.cgi?id=298084
   http://bugzilla.kernel.org/show_bug.cgi?id=7839
And likely some more nmi_watchdog=0 related issues.
Signed-off-by: Daniel Gollub <dgollub@suse.de>
Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
        if (l & MSR_IA32_APICBASE_ENABLE)
                mp_lapic_addr = l & MSR_IA32_APICBASE_BASE;
 
-       if (nmi_watchdog != NMI_NONE)
+       if (nmi_watchdog != NMI_NONE && nmi_watchdog != NMI_DISABLED)
                nmi_watchdog = NMI_LOCAL_APIC;
 
        printk(KERN_INFO "Found and enabled local APIC!\n");
 
        unsigned int *prev_nmi_count;
        int cpu;
 
-       if ((nmi_watchdog == NMI_NONE) || (nmi_watchdog == NMI_DEFAULT))
+       if ((nmi_watchdog == NMI_NONE) || (nmi_watchdog == NMI_DISABLED))
                return 0;
 
        if (!atomic_read(&nmi_active))
        if (!!old_state == !!nmi_watchdog_enabled)
                return 0;
 
-       if (atomic_read(&nmi_active) < 0) {
+       if (atomic_read(&nmi_active) < 0 || nmi_watchdog == NMI_DISABLED) {
                printk( KERN_WARNING "NMI watchdog is permanently disabled\n");
                return -EIO;
        }
 
        int *counts;
        int cpu;
 
-       if ((nmi_watchdog == NMI_NONE) || (nmi_watchdog == NMI_DEFAULT))
+       if ((nmi_watchdog == NMI_NONE) || (nmi_watchdog == NMI_DISABLED)) 
                return 0;
 
        if (!atomic_read(&nmi_active))
        if (!!old_state == !!nmi_watchdog_enabled)
                return 0;
 
-       if (atomic_read(&nmi_active) < 0) {
+       if (atomic_read(&nmi_active) < 0 || nmi_watchdog == NMI_DISABLED) {
                printk( KERN_WARNING "NMI watchdog is permanently disabled\n");
                return -EIO;
        }
 
 
 extern atomic_t nmi_active;
 extern unsigned int nmi_watchdog;
-#define NMI_DEFAULT     -1
+#define NMI_DISABLED    -1
 #define NMI_NONE       0
 #define NMI_IO_APIC    1
 #define NMI_LOCAL_APIC 2
 #define NMI_INVALID    3
+#define NMI_DEFAULT    NMI_DISABLED
 
 struct ctl_table;
 struct file;
 
 
 extern atomic_t nmi_active;
 extern unsigned int nmi_watchdog;
-#define NMI_DEFAULT    -1
+#define NMI_DISABLED    -1
 #define NMI_NONE       0
 #define NMI_IO_APIC    1
 #define NMI_LOCAL_APIC 2
 #define NMI_INVALID    3
+#define NMI_DEFAULT    NMI_DISABLED
 
 struct ctl_table;
 struct file;