diff options
Diffstat (limited to 'kernel/watchdog.c')
| -rw-r--r-- | kernel/watchdog.c | 50 | 
1 files changed, 26 insertions, 24 deletions
diff --git a/kernel/watchdog.c b/kernel/watchdog.c index 6e3c41a4024..d7ebdf4cea9 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); @@ -116,12 +118,12 @@ static void __touch_watchdog(void)  {  	int this_cpu = smp_processor_id(); -	__get_cpu_var(watchdog_touch_ts) = get_timestamp(this_cpu); +	__this_cpu_write(watchdog_touch_ts, get_timestamp(this_cpu));  }  void touch_softlockup_watchdog(void)  { -	__raw_get_cpu_var(watchdog_touch_ts) = 0; +	__this_cpu_write(watchdog_touch_ts, 0);  }  EXPORT_SYMBOL(touch_softlockup_watchdog); @@ -165,12 +167,12 @@ void touch_softlockup_watchdog_sync(void)  /* watchdog detector functions */  static int is_hardlockup(void)  { -	unsigned long hrint = __get_cpu_var(hrtimer_interrupts); +	unsigned long hrint = __this_cpu_read(hrtimer_interrupts); -	if (__get_cpu_var(hrtimer_interrupts_saved) == hrint) +	if (__this_cpu_read(hrtimer_interrupts_saved) == hrint)  		return 1; -	__get_cpu_var(hrtimer_interrupts_saved) = hrint; +	__this_cpu_write(hrtimer_interrupts_saved, hrint);  	return 0;  }  #endif @@ -203,8 +205,8 @@ static void watchdog_overflow_callback(struct perf_event *event, int nmi,  	/* Ensure the watchdog never gets throttled */  	event->hw.interrupts = 0; -	if (__get_cpu_var(watchdog_nmi_touch) == true) { -		__get_cpu_var(watchdog_nmi_touch) = false; +	if (__this_cpu_read(watchdog_nmi_touch) == true) { +		__this_cpu_write(watchdog_nmi_touch, false);  		return;  	} @@ -218,7 +220,7 @@ static void watchdog_overflow_callback(struct perf_event *event, int nmi,  		int this_cpu = smp_processor_id();  		/* only print hardlockups once */ -		if (__get_cpu_var(hard_watchdog_warn) == true) +		if (__this_cpu_read(hard_watchdog_warn) == true)  			return;  		if (hardlockup_panic) @@ -226,16 +228,16 @@ static void watchdog_overflow_callback(struct perf_event *event, int nmi,  		else  			WARN(1, "Watchdog detected hard LOCKUP on cpu %d", this_cpu); -		__get_cpu_var(hard_watchdog_warn) = true; +		__this_cpu_write(hard_watchdog_warn, true);  		return;  	} -	__get_cpu_var(hard_watchdog_warn) = false; +	__this_cpu_write(hard_watchdog_warn, false);  	return;  }  static void watchdog_interrupt_count(void)  { -	__get_cpu_var(hrtimer_interrupts)++; +	__this_cpu_inc(hrtimer_interrupts);  }  #else  static inline void watchdog_interrupt_count(void) { return; } @@ -244,7 +246,7 @@ static inline void watchdog_interrupt_count(void) { return; }  /* watchdog kicker functions */  static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)  { -	unsigned long touch_ts = __get_cpu_var(watchdog_touch_ts); +	unsigned long touch_ts = __this_cpu_read(watchdog_touch_ts);  	struct pt_regs *regs = get_irq_regs();  	int duration; @@ -252,18 +254,18 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)  	watchdog_interrupt_count();  	/* kick the softlockup detector */ -	wake_up_process(__get_cpu_var(softlockup_watchdog)); +	wake_up_process(__this_cpu_read(softlockup_watchdog));  	/* .. and repeat */  	hrtimer_forward_now(hrtimer, ns_to_ktime(get_sample_period()));  	if (touch_ts == 0) { -		if (unlikely(__get_cpu_var(softlockup_touch_sync))) { +		if (unlikely(__this_cpu_read(softlockup_touch_sync))) {  			/*  			 * If the time stamp was touched atomically  			 * make sure the scheduler tick is up to date.  			 */ -			__get_cpu_var(softlockup_touch_sync) = false; +			__this_cpu_write(softlockup_touch_sync, false);  			sched_clock_tick();  		}  		__touch_watchdog(); @@ -279,7 +281,7 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)  	duration = is_softlockup(touch_ts);  	if (unlikely(duration)) {  		/* only warn once */ -		if (__get_cpu_var(soft_watchdog_warn) == true) +		if (__this_cpu_read(soft_watchdog_warn) == true)  			return HRTIMER_RESTART;  		printk(KERN_ERR "BUG: soft lockup - CPU#%d stuck for %us! [%s:%d]\n", @@ -294,9 +296,9 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)  		if (softlockup_panic)  			panic("softlockup: hung tasks"); -		__get_cpu_var(soft_watchdog_warn) = true; +		__this_cpu_write(soft_watchdog_warn, true);  	} else -		__get_cpu_var(soft_watchdog_warn) = false; +		__this_cpu_write(soft_watchdog_warn, false);  	return HRTIMER_RESTART;  } @@ -307,7 +309,7 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)   */  static int watchdog(void *unused)  { -	struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 }; +	static struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 };  	struct hrtimer *hrtimer = &__raw_get_cpu_var(watchdog_hrtimer);  	sched_setscheduler(current, SCHED_FIFO, ¶m); @@ -364,7 +366,8 @@ static int watchdog_nmi_enable(int cpu)  		goto out_save;  	} -	printk(KERN_ERR "NMI watchdog failed to create perf event on cpu%i: %p\n", cpu, event); +	printk(KERN_ERR "NMI watchdog disabled for cpu%i: unable to create perf event: %ld\n", +	       cpu, PTR_ERR(event));  	return PTR_ERR(event);  	/* success path */ @@ -547,13 +550,13 @@ static struct notifier_block __cpuinitdata cpu_nfb = {  	.notifier_call = cpu_callback  }; -static int __init spawn_watchdog_task(void) +void __init lockup_detector_init(void)  {  	void *cpu = (void *)(long)smp_processor_id();  	int err;  	if (no_watchdog) -		return 0; +		return;  	err = cpu_callback(&cpu_nfb, CPU_UP_PREPARE, cpu);  	WARN_ON(notifier_to_errno(err)); @@ -561,6 +564,5 @@ static int __init spawn_watchdog_task(void)  	cpu_callback(&cpu_nfb, CPU_ONLINE, cpu);  	register_cpu_notifier(&cpu_nfb); -	return 0; +	return;  } -early_initcall(spawn_watchdog_task);  |