diff options
author | Don Zickus <dzickus@redhat.com> | 2010-11-29 17:07:17 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2010-12-09 18:01:06 -0500 |
commit | 5dc3055879b8f659f62abb7c3d1eaa4d02e36d65 (patch) | |
tree | 823b69dd3ed28bc9d05fc4ecf31e780341efdf5b | |
parent | 96a84c20d635fb1e98ab92f9fc517c4441f5c424 (diff) |
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: Huang Ying <ying.huang@intel.com>
Signed-off-by: Don Zickus <dzickus@redhat.com>
Reviewed-by: Cyrill Gorcunov <gorcunov@gmail.com>
Acked-by: Yinghai Lu <yinghai@kernel.org>
Cc: fweisbec@gmail.com
LKML-Reference: <1291068437-5331-3-git-send-email-dzickus@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | Documentation/kernel-parameters.txt | 10 | ||||
-rw-r--r-- | arch/x86/kernel/apic/hw_nmi.c | 3 | ||||
-rw-r--r-- | arch/x86/kernel/traps.c | 16 | ||||
-rw-r--r-- | kernel/sysctl.c | 16 | ||||
-rw-r--r-- | kernel/sysctl_binary.c | 1 | ||||
-rw-r--r-- | kernel/watchdog.c | 2 |
6 files changed, 30 insertions, 18 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index cdd2a6e8a3b7..5e55e4623ab5 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
@@ -1579,20 +1579,12 @@ and is between 256 and 4096 characters. It is defined in the file | |||
1579 | 1579 | ||
1580 | nmi_watchdog= [KNL,BUGS=X86] Debugging features for SMP kernels | 1580 | nmi_watchdog= [KNL,BUGS=X86] Debugging features for SMP kernels |
1581 | Format: [panic,][num] | 1581 | Format: [panic,][num] |
1582 | Valid num: 0,1,2 | 1582 | Valid num: 0 |
1583 | 0 - turn nmi_watchdog off | 1583 | 0 - turn nmi_watchdog off |
1584 | 1 - use the IO-APIC timer for the NMI watchdog | ||
1585 | 2 - use the local APIC for the NMI watchdog using | ||
1586 | a performance counter. Note: This will use one | ||
1587 | performance counter and the local APIC's performance | ||
1588 | vector. | ||
1589 | When panic is specified, panic when an NMI watchdog | 1584 | When panic is specified, panic when an NMI watchdog |
1590 | timeout occurs. | 1585 | timeout occurs. |
1591 | This is useful when you use a panic=... timeout and | 1586 | This is useful when you use a panic=... timeout and |
1592 | need the box quickly up again. | 1587 | need the box quickly up again. |
1593 | Instead of 1 and 2 it is possible to use the following | ||
1594 | symbolic names: lapic and ioapic | ||
1595 | Example: nmi_watchdog=2 or nmi_watchdog=panic,lapic | ||
1596 | 1588 | ||
1597 | netpoll.carrier_timeout= | 1589 | netpoll.carrier_timeout= |
1598 | [NET] Specifies amount of time (in seconds) that | 1590 | [NET] Specifies amount of time (in seconds) that |
diff --git a/arch/x86/kernel/apic/hw_nmi.c b/arch/x86/kernel/apic/hw_nmi.c index 2e94eb493591..c558e1101edf 100644 --- a/arch/x86/kernel/apic/hw_nmi.c +++ b/arch/x86/kernel/apic/hw_nmi.c | |||
@@ -99,6 +99,3 @@ static int __init register_trigger_all_cpu_backtrace(void) | |||
99 | } | 99 | } |
100 | early_initcall(register_trigger_all_cpu_backtrace); | 100 | early_initcall(register_trigger_all_cpu_backtrace); |
101 | #endif | 101 | #endif |
102 | |||
103 | /* STUB calls to mimic old nmi_watchdog behaviour */ | ||
104 | int unknown_nmi_panic; | ||
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index f02c179c2552..bb6f04167361 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c | |||
@@ -83,6 +83,8 @@ EXPORT_SYMBOL_GPL(used_vectors); | |||
83 | 83 | ||
84 | static int ignore_nmis; | 84 | static int ignore_nmis; |
85 | 85 | ||
86 | int unknown_nmi_panic; | ||
87 | |||
86 | static inline void conditional_sti(struct pt_regs *regs) | 88 | static inline void conditional_sti(struct pt_regs *regs) |
87 | { | 89 | { |
88 | if (regs->flags & X86_EFLAGS_IF) | 90 | if (regs->flags & X86_EFLAGS_IF) |
@@ -300,6 +302,13 @@ gp_in_kernel: | |||
300 | die("general protection fault", regs, error_code); | 302 | die("general protection fault", regs, error_code); |
301 | } | 303 | } |
302 | 304 | ||
305 | static int __init setup_unknown_nmi_panic(char *str) | ||
306 | { | ||
307 | unknown_nmi_panic = 1; | ||
308 | return 1; | ||
309 | } | ||
310 | __setup("unknown_nmi_panic", setup_unknown_nmi_panic); | ||
311 | |||
303 | static notrace __kprobes void | 312 | static notrace __kprobes void |
304 | mem_parity_error(unsigned char reason, struct pt_regs *regs) | 313 | mem_parity_error(unsigned char reason, struct pt_regs *regs) |
305 | { | 314 | { |
@@ -371,7 +380,7 @@ unknown_nmi_error(unsigned char reason, struct pt_regs *regs) | |||
371 | reason, smp_processor_id()); | 380 | reason, smp_processor_id()); |
372 | 381 | ||
373 | printk(KERN_EMERG "Do you have a strange power saving mode enabled?\n"); | 382 | printk(KERN_EMERG "Do you have a strange power saving mode enabled?\n"); |
374 | if (panic_on_unrecovered_nmi) | 383 | if (unknown_nmi_panic || panic_on_unrecovered_nmi) |
375 | panic("NMI: Not continuing"); | 384 | panic("NMI: Not continuing"); |
376 | 385 | ||
377 | printk(KERN_EMERG "Dazed and confused, but trying to continue\n"); | 386 | 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 | if (notify_die(DIE_NMI, "nmi", regs, reason, 2, SIGINT) | 406 | if (notify_die(DIE_NMI, "nmi", regs, reason, 2, SIGINT) |
398 | == NOTIFY_STOP) | 407 | == NOTIFY_STOP) |
399 | return; | 408 | return; |
400 | |||
401 | unknown_nmi_error(reason, regs); | ||
402 | #else | ||
403 | unknown_nmi_error(reason, regs); | ||
404 | #endif | 409 | #endif |
410 | unknown_nmi_error(reason, regs); | ||
405 | 411 | ||
406 | return; | 412 | return; |
407 | } | 413 | } |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index cbd97da7a613..46404414d8a7 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
@@ -745,6 +745,22 @@ static struct ctl_table kern_table[] = { | |||
745 | .extra1 = &zero, | 745 | .extra1 = &zero, |
746 | .extra2 = &one, | 746 | .extra2 = &one, |
747 | }, | 747 | }, |
748 | { | ||
749 | .procname = "nmi_watchdog", | ||
750 | .data = &watchdog_enabled, | ||
751 | .maxlen = sizeof (int), | ||
752 | .mode = 0644, | ||
753 | .proc_handler = proc_dowatchdog_enabled, | ||
754 | }, | ||
755 | #endif | ||
756 | #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86) | ||
757 | { | ||
758 | .procname = "unknown_nmi_panic", | ||
759 | .data = &unknown_nmi_panic, | ||
760 | .maxlen = sizeof (int), | ||
761 | .mode = 0644, | ||
762 | .proc_handler = proc_dointvec, | ||
763 | }, | ||
748 | #endif | 764 | #endif |
749 | #if defined(CONFIG_X86) | 765 | #if defined(CONFIG_X86) |
750 | { | 766 | { |
diff --git a/kernel/sysctl_binary.c b/kernel/sysctl_binary.c index 1357c5786064..4b2545a136ff 100644 --- a/kernel/sysctl_binary.c +++ b/kernel/sysctl_binary.c | |||
@@ -136,7 +136,6 @@ static const struct bin_table bin_kern_table[] = { | |||
136 | { CTL_INT, KERN_IA64_UNALIGNED, "ignore-unaligned-usertrap" }, | 136 | { CTL_INT, KERN_IA64_UNALIGNED, "ignore-unaligned-usertrap" }, |
137 | { CTL_INT, KERN_COMPAT_LOG, "compat-log" }, | 137 | { CTL_INT, KERN_COMPAT_LOG, "compat-log" }, |
138 | { CTL_INT, KERN_MAX_LOCK_DEPTH, "max_lock_depth" }, | 138 | { CTL_INT, KERN_MAX_LOCK_DEPTH, "max_lock_depth" }, |
139 | { CTL_INT, KERN_NMI_WATCHDOG, "nmi_watchdog" }, | ||
140 | { CTL_INT, KERN_PANIC_ON_NMI, "panic_on_unrecovered_nmi" }, | 139 | { CTL_INT, KERN_PANIC_ON_NMI, "panic_on_unrecovered_nmi" }, |
141 | {} | 140 | {} |
142 | }; | 141 | }; |
diff --git a/kernel/watchdog.c b/kernel/watchdog.c index cad4e42060a9..eb17e143b5da 100644 --- a/kernel/watchdog.c +++ b/kernel/watchdog.c | |||
@@ -57,6 +57,8 @@ static int __init hardlockup_panic_setup(char *str) | |||
57 | { | 57 | { |
58 | if (!strncmp(str, "panic", 5)) | 58 | if (!strncmp(str, "panic", 5)) |
59 | hardlockup_panic = 1; | 59 | hardlockup_panic = 1; |
60 | else if (!strncmp(str, "0", 1)) | ||
61 | no_watchdog = 1; | ||
60 | return 1; | 62 | return 1; |
61 | } | 63 | } |
62 | __setup("nmi_watchdog=", hardlockup_panic_setup); | 64 | __setup("nmi_watchdog=", hardlockup_panic_setup); |