]> err.no Git - linux-2.6/commitdiff
[PATCH] i386: Enable NMI watchdog by default
authorAndi Kleen <ak@suse.de>
Tue, 26 Sep 2006 08:52:27 +0000 (10:52 +0200)
committerAndi Kleen <andi@basil.nowhere.org>
Tue, 26 Sep 2006 08:52:27 +0000 (10:52 +0200)
I've had good experiences with having this on by default on x86-64.
It turns nasty hangs into easier to debug oopses.

Enable the local APIC wdog by default for systems newer than 2004.

This comes from a strange compromise: according to arjan the reason
it was off by default was some old IBM systems that corrupted
registered when NMI happened in SMI. Can't remember more specific,
but >= 2004 should avoid these. It's probably overly broad
because most older systems should be ok (and the really old systems
won't be supported by the local apic watchdog anyways)

Signed-off-by: Andi Kleen <ak@suse.de>
arch/i386/kernel/nmi.c

index 8e4ed930ce6bacd6d8651fdc1785a468cd8c6f51..6e5085d5d2f6e7f97e5a3f0d4e9900df2dfcb06b 100644 (file)
@@ -21,6 +21,7 @@
 #include <linux/sysdev.h>
 #include <linux/sysctl.h>
 #include <linux/percpu.h>
+#include <linux/dmi.h>
 
 #include <asm/smp.h>
 #include <asm/nmi.h>
@@ -204,6 +205,14 @@ static int __init check_nmi_watchdog(void)
        unsigned int *prev_nmi_count;
        int cpu;
 
+       /* Enable NMI watchdog for newer systems.
+           Actually it should be safe for most systems before 2004 too except
+          for some IBM systems that corrupt registers when NMI happens
+          during SMM. Unfortunately we don't have more exact information
+          on these and use this coarse check. */
+       if (nmi_watchdog == NMI_DEFAULT && dmi_get_year(DMI_BIOS_DATE) >= 2004)
+               nmi_watchdog = NMI_LOCAL_APIC;
+
        if ((nmi_watchdog == NMI_NONE) || (nmi_watchdog == NMI_DEFAULT))
                return 0;