diff options
Diffstat (limited to 'kernel/watchdog.c')
| -rw-r--r-- | kernel/watchdog.c | 31 | 
1 files changed, 7 insertions, 24 deletions
| diff --git a/kernel/watchdog.c b/kernel/watchdog.c index f41334ef0971..b6b1f54a7837 100644 --- a/kernel/watchdog.c +++ b/kernel/watchdog.c @@ -161,6 +161,8 @@ static void lockup_detector_update_enable(void)  #ifdef CONFIG_SOFTLOCKUP_DETECTOR +#define SOFTLOCKUP_RESET	ULONG_MAX +  /* Global variables, exported for sysctl */  unsigned int __read_mostly softlockup_panic =  			CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE; @@ -173,8 +175,6 @@ static DEFINE_PER_CPU(struct hrtimer, watchdog_hrtimer);  static DEFINE_PER_CPU(bool, softlockup_touch_sync);  static DEFINE_PER_CPU(bool, soft_watchdog_warn);  static DEFINE_PER_CPU(unsigned long, hrtimer_interrupts); -static DEFINE_PER_CPU(unsigned long, soft_lockup_hrtimer_cnt); -static DEFINE_PER_CPU(struct task_struct *, softlockup_task_ptr_saved);  static DEFINE_PER_CPU(unsigned long, hrtimer_interrupts_saved);  static unsigned long soft_lockup_nmi_warn; @@ -274,7 +274,7 @@ notrace void touch_softlockup_watchdog_sched(void)  	 * Preemption can be enabled.  It doesn't matter which CPU's timestamp  	 * gets zeroed here, so use the raw_ operation.  	 */ -	raw_cpu_write(watchdog_touch_ts, 0); +	raw_cpu_write(watchdog_touch_ts, SOFTLOCKUP_RESET);  }  notrace void touch_softlockup_watchdog(void) @@ -298,14 +298,14 @@ void touch_all_softlockup_watchdogs(void)  	 * the softlockup check.  	 */  	for_each_cpu(cpu, &watchdog_allowed_mask) -		per_cpu(watchdog_touch_ts, cpu) = 0; +		per_cpu(watchdog_touch_ts, cpu) = SOFTLOCKUP_RESET;  	wq_watchdog_touch(-1);  }  void touch_softlockup_watchdog_sync(void)  {  	__this_cpu_write(softlockup_touch_sync, true); -	__this_cpu_write(watchdog_touch_ts, 0); +	__this_cpu_write(watchdog_touch_ts, SOFTLOCKUP_RESET);  }  static int is_softlockup(unsigned long touch_ts) @@ -350,8 +350,6 @@ static DEFINE_PER_CPU(struct cpu_stop_work, softlockup_stop_work);   */  static int softlockup_fn(void *data)  { -	__this_cpu_write(soft_lockup_hrtimer_cnt, -			 __this_cpu_read(hrtimer_interrupts));  	__touch_watchdog();  	complete(this_cpu_ptr(&softlockup_completion)); @@ -383,7 +381,7 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)  	/* .. and repeat */  	hrtimer_forward_now(hrtimer, ns_to_ktime(sample_period)); -	if (touch_ts == 0) { +	if (touch_ts == SOFTLOCKUP_RESET) {  		if (unlikely(__this_cpu_read(softlockup_touch_sync))) {  			/*  			 * If the time stamp was touched atomically @@ -416,22 +414,8 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)  			return HRTIMER_RESTART;  		/* only warn once */ -		if (__this_cpu_read(soft_watchdog_warn) == true) { -			/* -			 * When multiple processes are causing softlockups the -			 * softlockup detector only warns on the first one -			 * because the code relies on a full quiet cycle to -			 * re-arm.  The second process prevents the quiet cycle -			 * and never gets reported.  Use task pointers to detect -			 * this. -			 */ -			if (__this_cpu_read(softlockup_task_ptr_saved) != -			    current) { -				__this_cpu_write(soft_watchdog_warn, false); -				__touch_watchdog(); -			} +		if (__this_cpu_read(soft_watchdog_warn) == true)  			return HRTIMER_RESTART; -		}  		if (softlockup_all_cpu_backtrace) {  			/* Prevent multiple soft-lockup reports if one cpu is already @@ -447,7 +431,6 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)  		pr_emerg("BUG: soft lockup - CPU#%d stuck for %us! [%s:%d]\n",  			smp_processor_id(), duration,  			current->comm, task_pid_nr(current)); -		__this_cpu_write(softlockup_task_ptr_saved, current);  		print_modules();  		print_irqtrace_events(current);  		if (regs) | 

