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); |
