diff options
Diffstat (limited to 'kernel/softlockup.c')
| -rw-r--r-- | kernel/softlockup.c | 15 | 
1 files changed, 15 insertions, 0 deletions
diff --git a/kernel/softlockup.c b/kernel/softlockup.c index d22579087e2..0d4c7898ab8 100644 --- a/kernel/softlockup.c +++ b/kernel/softlockup.c @@ -25,6 +25,7 @@ static DEFINE_SPINLOCK(print_lock);  static DEFINE_PER_CPU(unsigned long, softlockup_touch_ts); /* touch timestamp */  static DEFINE_PER_CPU(unsigned long, softlockup_print_ts); /* print timestamp */  static DEFINE_PER_CPU(struct task_struct *, softlockup_watchdog); +static DEFINE_PER_CPU(bool, softlock_touch_sync);  static int __read_mostly did_panic;  int __read_mostly softlockup_thresh = 60; @@ -79,6 +80,12 @@ void touch_softlockup_watchdog(void)  }  EXPORT_SYMBOL(touch_softlockup_watchdog); +void touch_softlockup_watchdog_sync(void) +{ +	__raw_get_cpu_var(softlock_touch_sync) = true; +	__raw_get_cpu_var(softlockup_touch_ts) = 0; +} +  void touch_all_softlockup_watchdogs(void)  {  	int cpu; @@ -118,6 +125,14 @@ void softlockup_tick(void)  	}  	if (touch_ts == 0) { +		if (unlikely(per_cpu(softlock_touch_sync, this_cpu))) { +			/* +			 * If the time stamp was touched atomically +			 * make sure the scheduler tick is up to date. +			 */ +			per_cpu(softlock_touch_sync, this_cpu) = false; +			sched_clock_tick(); +		}  		__touch_softlockup_watchdog();  		return;  	}  |