diff options
| -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 cdd2a6e8a3b..5e55e4623ab 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  	nmi_watchdog=	[KNL,BUGS=X86] Debugging features for SMP kernels  			Format: [panic,][num] -			Valid num: 0,1,2 +			Valid num: 0  			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  			timeout occurs.  			This is useful when you use a panic=... timeout and  			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=  			[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 2e94eb49359..c558e1101ed 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)  }  early_initcall(register_trigger_all_cpu_backtrace);  #endif - -/* STUB calls to mimic old nmi_watchdog behaviour */ -int unknown_nmi_panic; diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index f02c179c255..bb6f0416736 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c @@ -83,6 +83,8 @@ EXPORT_SYMBOL_GPL(used_vectors);  static int ignore_nmis; +int unknown_nmi_panic; +  static inline void conditional_sti(struct pt_regs *regs)  {  	if (regs->flags & X86_EFLAGS_IF) @@ -300,6 +302,13 @@ gp_in_kernel:  	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  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());  	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");  	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)  							== NOTIFY_STOP)  			return; - -			unknown_nmi_error(reason, regs); -#else -		unknown_nmi_error(reason, regs);  #endif +		unknown_nmi_error(reason, regs);  		return;  	} diff --git a/kernel/sysctl.c b/kernel/sysctl.c index cbd97da7a61..46404414d8a 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c @@ -745,6 +745,22 @@ static struct ctl_table kern_table[] = {  		.extra1		= &zero,  		.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  #if defined(CONFIG_X86)  	{ diff --git a/kernel/sysctl_binary.c b/kernel/sysctl_binary.c index 1357c578606..4b2545a136f 100644 --- a/kernel/sysctl_binary.c +++ b/kernel/sysctl_binary.c @@ -136,7 +136,6 @@ static const struct bin_table bin_kern_table[] = {  	{ CTL_INT,	KERN_IA64_UNALIGNED,		"ignore-unaligned-usertrap" },  	{ CTL_INT,	KERN_COMPAT_LOG,		"compat-log" },  	{ 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" },  	{}  }; diff --git a/kernel/watchdog.c b/kernel/watchdog.c index cad4e42060a..eb17e143b5d 100644 --- a/kernel/watchdog.c +++ b/kernel/watchdog.c @@ -57,6 +57,8 @@ static int __init hardlockup_panic_setup(char *str)  {  	if (!strncmp(str, "panic", 5))  		hardlockup_panic = 1; +	else if (!strncmp(str, "0", 1)) +		no_watchdog = 1;  	return 1;  }  __setup("nmi_watchdog=", hardlockup_panic_setup);  |