diff options
| author | Ingo Molnar <mingo@elte.hu> | 2011-02-16 13:33:35 +0100 | 
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2011-02-16 13:33:41 +0100 | 
| commit | a3ec4a603faf4244e275bf11b467aad092dfbd8a (patch) | |
| tree | 1c15009716b37629070ea221a00eb9fe2303a317 /kernel/watchdog.c | |
| parent | 51563cd53c4b1c1790fccd2e0af0e2b756589af9 (diff) | |
| parent | 85e2efbb1db9a18d218006706d6e4fbeb0216213 (diff) | |
| download | olio-linux-3.10-a3ec4a603faf4244e275bf11b467aad092dfbd8a.tar.xz olio-linux-3.10-a3ec4a603faf4244e275bf11b467aad092dfbd8a.zip  | |
Merge commit 'v2.6.38-rc5' into core/locking
Merge reason: pick up upstream fixes.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/watchdog.c')
| -rw-r--r-- | kernel/watchdog.c | 53 | 
1 files changed, 27 insertions, 26 deletions
diff --git a/kernel/watchdog.c b/kernel/watchdog.c index d7ebdf4cea9..18bb15776c5 100644 --- a/kernel/watchdog.c +++ b/kernel/watchdog.c @@ -27,7 +27,7 @@  #include <asm/irq_regs.h>  #include <linux/perf_event.h> -int watchdog_enabled; +int watchdog_enabled = 1;  int __read_mostly softlockup_thresh = 60;  static DEFINE_PER_CPU(unsigned long, watchdog_touch_ts); @@ -43,9 +43,6 @@ static DEFINE_PER_CPU(unsigned long, hrtimer_interrupts_saved);  static DEFINE_PER_CPU(struct perf_event *, watchdog_ev);  #endif -static int no_watchdog; - -  /* boot commands */  /*   * Should we panic when a soft-lockup or hard-lockup occurs: @@ -58,7 +55,7 @@ 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; +		watchdog_enabled = 0;  	return 1;  }  __setup("nmi_watchdog=", hardlockup_panic_setup); @@ -77,7 +74,7 @@ __setup("softlockup_panic=", softlockup_panic_setup);  static int __init nowatchdog_setup(char *str)  { -	no_watchdog = 1; +	watchdog_enabled = 0;  	return 1;  }  __setup("nowatchdog", nowatchdog_setup); @@ -85,7 +82,7 @@ __setup("nowatchdog", nowatchdog_setup);  /* deprecated */  static int __init nosoftlockup_setup(char *str)  { -	no_watchdog = 1; +	watchdog_enabled = 0;  	return 1;  }  __setup("nosoftlockup", nosoftlockup_setup); @@ -366,8 +363,14 @@ static int watchdog_nmi_enable(int cpu)  		goto out_save;  	} -	printk(KERN_ERR "NMI watchdog disabled for cpu%i: unable to create perf event: %ld\n", -	       cpu, PTR_ERR(event)); + +	/* vary the KERN level based on the returned errno */ +	if (PTR_ERR(event) == -EOPNOTSUPP) +		printk(KERN_INFO "NMI watchdog disabled (cpu%i): not supported (no LAPIC?)\n", cpu); +	else if (PTR_ERR(event) == -ENOENT) +		printk(KERN_WARNING "NMI watchdog disabled (cpu%i): hardware events not enabled\n", cpu); +	else +		printk(KERN_ERR "NMI watchdog disabled (cpu%i): unable to create perf event: %ld\n", cpu, PTR_ERR(event));  	return PTR_ERR(event);  	/* success path */ @@ -432,9 +435,6 @@ static int watchdog_enable(int cpu)  		wake_up_process(p);  	} -	/* if any cpu succeeds, watchdog is considered enabled for the system */ -	watchdog_enabled = 1; -  	return 0;  } @@ -462,12 +462,16 @@ static void watchdog_disable(int cpu)  static void watchdog_enable_all_cpus(void)  {  	int cpu; -	int result = 0; + +	watchdog_enabled = 0;  	for_each_online_cpu(cpu) -		result += watchdog_enable(cpu); +		if (!watchdog_enable(cpu)) +			/* if any cpu succeeds, watchdog is considered +			   enabled for the system */ +			watchdog_enabled = 1; -	if (result) +	if (!watchdog_enabled)  		printk(KERN_ERR "watchdog: failed to be enabled on some cpus\n");  } @@ -476,9 +480,6 @@ static void watchdog_disable_all_cpus(void)  {  	int cpu; -	if (no_watchdog) -		return; -  	for_each_online_cpu(cpu)  		watchdog_disable(cpu); @@ -498,10 +499,12 @@ int proc_dowatchdog_enabled(struct ctl_table *table, int write,  {  	proc_dointvec(table, write, buffer, length, ppos); -	if (watchdog_enabled) -		watchdog_enable_all_cpus(); -	else -		watchdog_disable_all_cpus(); +	if (write) { +		if (watchdog_enabled) +			watchdog_enable_all_cpus(); +		else +			watchdog_disable_all_cpus(); +	}  	return 0;  } @@ -530,7 +533,8 @@ cpu_callback(struct notifier_block *nfb, unsigned long action, void *hcpu)  		break;  	case CPU_ONLINE:  	case CPU_ONLINE_FROZEN: -		err = watchdog_enable(hotcpu); +		if (watchdog_enabled) +			err = watchdog_enable(hotcpu);  		break;  #ifdef CONFIG_HOTPLUG_CPU  	case CPU_UP_CANCELED: @@ -555,9 +559,6 @@ void __init lockup_detector_init(void)  	void *cpu = (void *)(long)smp_processor_id();  	int err; -	if (no_watchdog) -		return; -  	err = cpu_callback(&cpu_nfb, CPU_UP_PREPARE, cpu);  	WARN_ON(notifier_to_errno(err));  |