diff options
Diffstat (limited to 'kernel/time/tick-sched.c')
-rw-r--r-- | kernel/time/tick-sched.c | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c index 3483e6cb9549..52db9e3c526e 100644 --- a/kernel/time/tick-sched.c +++ b/kernel/time/tick-sched.c | |||
@@ -167,9 +167,15 @@ void tick_nohz_stop_sched_tick(void) | |||
167 | goto end; | 167 | goto end; |
168 | 168 | ||
169 | cpu = smp_processor_id(); | 169 | cpu = smp_processor_id(); |
170 | if (unlikely(local_softirq_pending())) | 170 | if (unlikely(local_softirq_pending())) { |
171 | printk(KERN_ERR "NOHZ: local_softirq_pending %02x\n", | 171 | static int ratelimit; |
172 | local_softirq_pending()); | 172 | |
173 | if (ratelimit < 10) { | ||
174 | printk(KERN_ERR "NOHZ: local_softirq_pending %02x\n", | ||
175 | local_softirq_pending()); | ||
176 | ratelimit++; | ||
177 | } | ||
178 | } | ||
173 | 179 | ||
174 | now = ktime_get(); | 180 | now = ktime_get(); |
175 | /* | 181 | /* |
@@ -241,6 +247,21 @@ void tick_nohz_stop_sched_tick(void) | |||
241 | if (cpu == tick_do_timer_cpu) | 247 | if (cpu == tick_do_timer_cpu) |
242 | tick_do_timer_cpu = -1; | 248 | tick_do_timer_cpu = -1; |
243 | 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 | |||
244 | /* | 265 | /* |
245 | * calculate the expiry time for the next timer wheel | 266 | * calculate the expiry time for the next timer wheel |
246 | * timer | 267 | * timer |
@@ -248,7 +269,6 @@ void tick_nohz_stop_sched_tick(void) | |||
248 | expires = ktime_add_ns(last_update, tick_period.tv64 * | 269 | expires = ktime_add_ns(last_update, tick_period.tv64 * |
249 | delta_jiffies); | 270 | delta_jiffies); |
250 | ts->idle_expires = expires; | 271 | ts->idle_expires = expires; |
251 | ts->idle_sleeps++; | ||
252 | 272 | ||
253 | if (ts->nohz_mode == NOHZ_MODE_HIGHRES) { | 273 | if (ts->nohz_mode == NOHZ_MODE_HIGHRES) { |
254 | hrtimer_start(&ts->sched_timer, expires, | 274 | hrtimer_start(&ts->sched_timer, expires, |