diff options
Diffstat (limited to 'kernel/time')
-rw-r--r-- | kernel/time/tick-sched.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 3e7ebc4646b7..52db9e3c526e 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c | |||
@@ -247,6 +247,21 @@ void tick_nohz_stop_sched_tick(void) | |||
247 | if (cpu == tick_do_timer_cpu) | 247 | if (cpu == tick_do_timer_cpu) |
248 | tick_do_timer_cpu = -1; | 248 | tick_do_timer_cpu = -1; |
249 | 249 | ||
250 | ts->idle_sleeps++; | ||
251 | |||
252 | /* | ||
253 | * delta_jiffies >= NEXT_TIMER_MAX_DELTA signals that | ||
254 | * there is no timer pending or at least extremly far | ||
255 | * into the future (12 days for HZ=1000). In this case | ||
256 | * we simply stop the tick timer: | ||
257 | */ | ||
258 | if (unlikely(delta_jiffies >= NEXT_TIMER_MAX_DELTA)) { | ||
259 | ts->idle_expires.tv64 = KTIME_MAX; | ||
260 | if (ts->nohz_mode == NOHZ_MODE_HIGHRES) | ||
261 | hrtimer_cancel(&ts->sched_timer); | ||
262 | goto out; | ||
263 | } | ||
264 | |||
250 | /* | 265 | /* |
251 | * calculate the expiry time for the next timer wheel | 266 | * calculate the expiry time for the next timer wheel |
252 | * timer | 267 | * timer |
@@ -254,7 +269,6 @@ void tick_nohz_stop_sched_tick(void) | |||
254 | expires = ktime_add_ns(last_update, tick_period.tv64 * | 269 | expires = ktime_add_ns(last_update, tick_period.tv64 * |
255 | delta_jiffies); | 270 | delta_jiffies); |
256 | ts->idle_expires = expires; | 271 | ts->idle_expires = expires; |
257 | ts->idle_sleeps++; | ||
258 | 272 | ||
259 | if (ts->nohz_mode == NOHZ_MODE_HIGHRES) { | 273 | if (ts->nohz_mode == NOHZ_MODE_HIGHRES) { |
260 | hrtimer_start(&ts->sched_timer, expires, | 274 | hrtimer_start(&ts->sched_timer, expires, |