Commit fef2c9bc authored by Don Zickus's avatar Don Zickus Committed by Linus Torvalds

kernel/watchdog.c: allow hardlockup to panic by default

When a cpu is considered stuck, instead of limping along and just printing
a warning, it is sometimes preferred to just panic, let kdump capture the
vmcore and reboot.  This gets the machine back into a stable state quickly
while saving the info that got it into a stuck state to begin with.

Add a Kconfig option to allow users to set the hardlockup to panic
by default.  Also add in a 'nmi_watchdog=nopanic' to override this.

[akpm@linux-foundation.org: fix strncmp length]
Signed-off-by: default avatarDon Zickus <dzickus@redhat.com>
Acked-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
Reviewed-by: default avatarWANG Cong <xiyou.wangcong@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent b1b5f65e
...@@ -1597,11 +1597,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted. ...@@ -1597,11 +1597,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
Format: [state][,regs][,debounce][,die] Format: [state][,regs][,debounce][,die]
nmi_watchdog= [KNL,BUGS=X86] Debugging features for SMP kernels nmi_watchdog= [KNL,BUGS=X86] Debugging features for SMP kernels
Format: [panic,][num] Format: [panic,][nopanic,][num]
Valid num: 0 Valid num: 0
0 - turn nmi_watchdog off 0 - turn nmi_watchdog off
When panic is specified, panic when an NMI watchdog When panic is specified, panic when an NMI watchdog
timeout occurs. timeout occurs (or 'nopanic' to override the opposite
default).
This is useful when you use a panic=... timeout and This is useful when you use a panic=... timeout and
need the box quickly up again. need the box quickly up again.
......
...@@ -48,12 +48,15 @@ static DEFINE_PER_CPU(struct perf_event *, watchdog_ev); ...@@ -48,12 +48,15 @@ static DEFINE_PER_CPU(struct perf_event *, watchdog_ev);
* Should we panic when a soft-lockup or hard-lockup occurs: * Should we panic when a soft-lockup or hard-lockup occurs:
*/ */
#ifdef CONFIG_HARDLOCKUP_DETECTOR #ifdef CONFIG_HARDLOCKUP_DETECTOR
static int hardlockup_panic; static int hardlockup_panic =
CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE;
static int __init hardlockup_panic_setup(char *str) static int __init hardlockup_panic_setup(char *str)
{ {
if (!strncmp(str, "panic", 5)) if (!strncmp(str, "panic", 5))
hardlockup_panic = 1; hardlockup_panic = 1;
else if (!strncmp(str, "nopanic", 7))
hardlockup_panic = 0;
else if (!strncmp(str, "0", 1)) else if (!strncmp(str, "0", 1))
watchdog_enabled = 0; watchdog_enabled = 0;
return 1; return 1;
......
...@@ -171,6 +171,23 @@ config HARDLOCKUP_DETECTOR ...@@ -171,6 +171,23 @@ config HARDLOCKUP_DETECTOR
def_bool LOCKUP_DETECTOR && PERF_EVENTS && HAVE_PERF_EVENTS_NMI && \ def_bool LOCKUP_DETECTOR && PERF_EVENTS && HAVE_PERF_EVENTS_NMI && \
!ARCH_HAS_NMI_WATCHDOG !ARCH_HAS_NMI_WATCHDOG
config BOOTPARAM_HARDLOCKUP_PANIC
bool "Panic (Reboot) On Hard Lockups"
depends on LOCKUP_DETECTOR
help
Say Y here to enable the kernel to panic on "hard lockups",
which are bugs that cause the kernel to loop in kernel
mode with interrupts disabled for more than 60 seconds.
Say N if unsure.
config BOOTPARAM_HARDLOCKUP_PANIC_VALUE
int
depends on LOCKUP_DETECTOR
range 0 1
default 0 if !BOOTPARAM_HARDLOCKUP_PANIC
default 1 if BOOTPARAM_HARDLOCKUP_PANIC
config BOOTPARAM_SOFTLOCKUP_PANIC config BOOTPARAM_SOFTLOCKUP_PANIC
bool "Panic (Reboot) On Soft Lockups" bool "Panic (Reboot) On Soft Lockups"
depends on LOCKUP_DETECTOR depends on LOCKUP_DETECTOR
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment