mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-21 06:01:23 +00:00
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>
This commit is contained in:
parent
96a84c20d6
commit
5dc3055879
6 changed files with 30 additions and 18 deletions
|
@ -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)
|
||||||
}
|
}
|
||||||
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);
|
||||||
|
|
||||||
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 @@ gp_in_kernel:
|
||||||
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)
|
||||||
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)
|
||||||
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[] = {
|
||||||
.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[] = {
|
||||||
{ 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)
|
||||||
{
|
{
|
||||||
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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue