]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
nmi_watchdog: Config option to enable new nmi_watchdog
authorDon Zickus <dzickus@redhat.com>
Sat, 6 Feb 2010 02:47:05 +0000 (21:47 -0500)
committerIngo Molnar <mingo@elte.hu>
Mon, 8 Feb 2010 07:29:03 +0000 (08:29 +0100)
These are the bits that enable the new nmi_watchdog and safely
isolate the old nmi_watchdog.  Only one or the other can run,
not both at the same time.

Signed-off-by: Don Zickus <dzickus@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: gorcunov@gmail.com
Cc: aris@redhat.com
Cc: peterz@infradead.org
LKML-Reference: <1265424425-31562-4-git-send-email-dzickus@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/kernel/apic/Makefile
arch/x86/kernel/traps.c
include/linux/nmi.h
kernel/Makefile
lib/Kconfig.debug

index 565c1bfc507d41b8387eea7cc7e6ffd22f3f114a..1a4512e48d24ef42c2ac8d0de0919212ef517eae 100644 (file)
@@ -2,7 +2,12 @@
 # Makefile for local APIC drivers and for the IO-APIC code
 #
 
-obj-$(CONFIG_X86_LOCAL_APIC)   += apic.o apic_noop.o probe_$(BITS).o ipi.o nmi.o
+obj-$(CONFIG_X86_LOCAL_APIC)   += apic.o apic_noop.o probe_$(BITS).o ipi.o
+ifneq ($(CONFIG_NMI_WATCHDOG),y)
+obj-$(CONFIG_X86_LOCAL_APIC)   += nmi.o
+endif
+obj-$(CONFIG_NMI_WATCHDOG)     += hw_nmi.o
+
 obj-$(CONFIG_X86_IO_APIC)      += io_apic.o
 obj-$(CONFIG_SMP)              += ipi.o
 
index 51ef893ffa655d8477eb1593dc6209c5ead2c80c..973cbc4f044f60c284b53146bd482136704c1b63 100644 (file)
@@ -406,6 +406,7 @@ static notrace __kprobes void default_do_nmi(struct pt_regs *regs)
                                                        == NOTIFY_STOP)
                        return;
 
+#ifndef CONFIG_NMI_WATCHDOG
                /*
                 * Ok, so this is none of the documented NMI sources,
                 * so it must be the NMI watchdog.
@@ -413,6 +414,7 @@ static notrace __kprobes void default_do_nmi(struct pt_regs *regs)
                if (nmi_watchdog_tick(regs, reason))
                        return;
                if (!do_nmi_callback(regs, cpu))
+#endif /* !CONFIG_NMI_WATCHDOG */
                        unknown_nmi_error(reason, regs);
 #else
                unknown_nmi_error(reason, regs);
index b752e807addece22ec9210f0d109d2818505d34d..a42ff0bef7086b5e149e0a5f5a734f50145a5f19 100644 (file)
@@ -47,4 +47,8 @@ static inline bool trigger_all_cpu_backtrace(void)
 }
 #endif
 
+#ifdef CONFIG_NMI_WATCHDOG
+int hw_nmi_is_cpu_stuck(struct pt_regs *);
+#endif
+
 #endif
index 864ff75d65f23da5a5556a8883d06f7aa6169ac8..8a5abe53ebadd1e97cfb1e9fa297b882e388ff65 100644 (file)
@@ -76,6 +76,7 @@ obj-$(CONFIG_AUDIT_TREE) += audit_tree.o
 obj-$(CONFIG_KPROBES) += kprobes.o
 obj-$(CONFIG_KGDB) += kgdb.o
 obj-$(CONFIG_DETECT_SOFTLOCKUP) += softlockup.o
+obj-$(CONFIG_NMI_WATCHDOG) += nmi_watchdog.o
 obj-$(CONFIG_DETECT_HUNG_TASK) += hung_task.o
 obj-$(CONFIG_GENERIC_HARDIRQS) += irq/
 obj-$(CONFIG_SECCOMP) += seccomp.o
index 25c3ed594c547966c1c291750d8adeb3b9e5674b..f80b67e72aa0f82cc8414e96fa576e53cd0a29ae 100644 (file)
@@ -170,6 +170,19 @@ config DETECT_SOFTLOCKUP
           can be detected via the NMI-watchdog, on platforms that
           support it.)
 
+config NMI_WATCHDOG
+       bool "Detect Hard Lockups with an NMI Watchdog"
+       depends on DEBUG_KERNEL && PERF_EVENTS
+       default y
+       help
+         Say Y here to enable the kernel to use the NMI as a watchdog
+         to detect hard lockups.  This is useful when a cpu hangs for no
+         reason but can still respond to NMIs.  A backtrace is displayed
+         for reviewing and reporting.
+
+         The overhead should be minimal, just an extra NMI every few
+         seconds.
+
 config BOOTPARAM_SOFTLOCKUP_PANIC
        bool "Panic (Reboot) On Soft Lockups"
        depends on DETECT_SOFTLOCKUP