Commit 5dc30558 authored by Don Zickus's avatar Don Zickus Committed by Ingo Molnar

x86, NMI: Add back unknown_nmi_panic and nmi_watchdog sysctls

Originally adapted from Huang Ying's patch which moved the
unknown_nmi_panic to the traps.c file.  Because the old nmi
watchdog was deleted before this change happened, the
unknown_nmi_panic sysctl was lost.  This re-adds it.

Also, the nmi_watchdog sysctl was re-implemented and its
documentation updated accordingly.
Patch-inspired-by: default avatarHuang Ying <ying.huang@intel.com>
Signed-off-by: default avatarDon Zickus <dzickus@redhat.com>
Reviewed-by: default avatarCyrill Gorcunov <gorcunov@gmail.com>
Acked-by: default avatarYinghai Lu <yinghai@kernel.org>
Cc: fweisbec@gmail.com
LKML-Reference: <1291068437-5331-3-git-send-email-dzickus@redhat.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 96a84c20
...@@ -1579,20 +1579,12 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -1579,20 +1579,12 @@ and is between 256 and 4096 characters. It is defined in the file
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,][num]
Valid num: 0,1,2 Valid num: 0
0 - turn nmi_watchdog off 0 - turn nmi_watchdog off
1 - use the IO-APIC timer for the NMI watchdog
2 - use the local APIC for the NMI watchdog using
a performance counter. Note: This will use one
performance counter and the local APIC's performance
vector.
When panic is specified, panic when an NMI watchdog When panic is specified, panic when an NMI watchdog
timeout occurs. timeout occurs.
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.
Instead of 1 and 2 it is possible to use the following
symbolic names: lapic and ioapic
Example: nmi_watchdog=2 or nmi_watchdog=panic,lapic
netpoll.carrier_timeout= netpoll.carrier_timeout=
[NET] Specifies amount of time (in seconds) that [NET] Specifies amount of time (in seconds) that
......
...@@ -99,6 +99,3 @@ static int __init register_trigger_all_cpu_backtrace(void) ...@@ -99,6 +99,3 @@ static int __init register_trigger_all_cpu_backtrace(void)
} }
early_initcall(register_trigger_all_cpu_backtrace); early_initcall(register_trigger_all_cpu_backtrace);
#endif #endif
/* STUB calls to mimic old nmi_watchdog behaviour */
int unknown_nmi_panic;
...@@ -83,6 +83,8 @@ EXPORT_SYMBOL_GPL(used_vectors); ...@@ -83,6 +83,8 @@ EXPORT_SYMBOL_GPL(used_vectors);
static int ignore_nmis; static int ignore_nmis;
int unknown_nmi_panic;
static inline void conditional_sti(struct pt_regs *regs) static inline void conditional_sti(struct pt_regs *regs)
{ {
if (regs->flags & X86_EFLAGS_IF) if (regs->flags & X86_EFLAGS_IF)
...@@ -300,6 +302,13 @@ do_general_protection(struct pt_regs *regs, long error_code) ...@@ -300,6 +302,13 @@ do_general_protection(struct pt_regs *regs, long error_code)
die("general protection fault", regs, error_code); die("general protection fault", regs, error_code);
} }
static int __init setup_unknown_nmi_panic(char *str)
{
unknown_nmi_panic = 1;
return 1;
}
__setup("unknown_nmi_panic", setup_unknown_nmi_panic);
static notrace __kprobes void static notrace __kprobes void
mem_parity_error(unsigned char reason, struct pt_regs *regs) mem_parity_error(unsigned char reason, struct pt_regs *regs)
{ {
...@@ -371,7 +380,7 @@ unknown_nmi_error(unsigned char reason, struct pt_regs *regs) ...@@ -371,7 +380,7 @@ unknown_nmi_error(unsigned char reason, struct pt_regs *regs)
reason, smp_processor_id()); reason, smp_processor_id());
printk(KERN_EMERG "Do you have a strange power saving mode enabled?\n"); printk(KERN_EMERG "Do you have a strange power saving mode enabled?\n");
if (panic_on_unrecovered_nmi) if (unknown_nmi_panic || panic_on_unrecovered_nmi)
panic("NMI: Not continuing"); panic("NMI: Not continuing");
printk(KERN_EMERG "Dazed and confused, but trying to continue\n"); printk(KERN_EMERG "Dazed and confused, but trying to continue\n");
...@@ -397,11 +406,8 @@ static notrace __kprobes void default_do_nmi(struct pt_regs *regs) ...@@ -397,11 +406,8 @@ static notrace __kprobes void default_do_nmi(struct pt_regs *regs)
if (notify_die(DIE_NMI, "nmi", regs, reason, 2, SIGINT) if (notify_die(DIE_NMI, "nmi", regs, reason, 2, SIGINT)
== NOTIFY_STOP) == NOTIFY_STOP)
return; return;
unknown_nmi_error(reason, regs);
#else
unknown_nmi_error(reason, regs);
#endif #endif
unknown_nmi_error(reason, regs);
return; return;
} }
......
...@@ -745,6 +745,22 @@ static struct ctl_table kern_table[] = { ...@@ -745,6 +745,22 @@ static struct ctl_table kern_table[] = {
.extra1 = &zero, .extra1 = &zero,
.extra2 = &one, .extra2 = &one,
}, },
{
.procname = "nmi_watchdog",
.data = &watchdog_enabled,
.maxlen = sizeof (int),
.mode = 0644,
.proc_handler = proc_dowatchdog_enabled,
},
#endif
#if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86)
{
.procname = "unknown_nmi_panic",
.data = &unknown_nmi_panic,
.maxlen = sizeof (int),
.mode = 0644,
.proc_handler = proc_dointvec,
},
#endif #endif
#if defined(CONFIG_X86) #if defined(CONFIG_X86)
{ {
......
...@@ -136,7 +136,6 @@ static const struct bin_table bin_kern_table[] = { ...@@ -136,7 +136,6 @@ static const struct bin_table bin_kern_table[] = {
{ CTL_INT, KERN_IA64_UNALIGNED, "ignore-unaligned-usertrap" }, { CTL_INT, KERN_IA64_UNALIGNED, "ignore-unaligned-usertrap" },
{ CTL_INT, KERN_COMPAT_LOG, "compat-log" }, { CTL_INT, KERN_COMPAT_LOG, "compat-log" },
{ CTL_INT, KERN_MAX_LOCK_DEPTH, "max_lock_depth" }, { CTL_INT, KERN_MAX_LOCK_DEPTH, "max_lock_depth" },
{ CTL_INT, KERN_NMI_WATCHDOG, "nmi_watchdog" },
{ CTL_INT, KERN_PANIC_ON_NMI, "panic_on_unrecovered_nmi" }, { CTL_INT, KERN_PANIC_ON_NMI, "panic_on_unrecovered_nmi" },
{} {}
}; };
......
...@@ -57,6 +57,8 @@ static int __init hardlockup_panic_setup(char *str) ...@@ -57,6 +57,8 @@ 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, "0", 1))
no_watchdog = 1;
return 1; return 1;
} }
__setup("nmi_watchdog=", hardlockup_panic_setup); __setup("nmi_watchdog=", hardlockup_panic_setup);
......
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