nmi_watchdog: Config option to enable new nmi_watchdog
Don Zickus [Sat, 6 Feb 2010 02:47:05 +0000 (21:47 -0500)]
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 565c1bf..1a4512e 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 51ef893..973cbc4 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 b752e80..a42ff0b 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 864ff75..8a5abe5 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 25c3ed5..f80b67e 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