diff options
Diffstat (limited to 'kernel/timer.c')
-rw-r--r-- | kernel/timer.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/kernel/timer.c b/kernel/timer.c index 7fada698bd1a..a61c09374eba 100644 --- a/kernel/timer.c +++ b/kernel/timer.c | |||
@@ -1326,18 +1326,21 @@ static unsigned long cmp_next_hrtimer_event(unsigned long now, | |||
1326 | unsigned long get_next_timer_interrupt(unsigned long now) | 1326 | unsigned long get_next_timer_interrupt(unsigned long now) |
1327 | { | 1327 | { |
1328 | struct tvec_base *base = __this_cpu_read(tvec_bases); | 1328 | struct tvec_base *base = __this_cpu_read(tvec_bases); |
1329 | unsigned long expires; | 1329 | unsigned long expires = now + NEXT_TIMER_MAX_DELTA; |
1330 | 1330 | ||
1331 | /* | 1331 | /* |
1332 | * Pretend that there is no timer pending if the cpu is offline. | 1332 | * Pretend that there is no timer pending if the cpu is offline. |
1333 | * Possible pending timers will be migrated later to an active cpu. | 1333 | * Possible pending timers will be migrated later to an active cpu. |
1334 | */ | 1334 | */ |
1335 | if (cpu_is_offline(smp_processor_id())) | 1335 | if (cpu_is_offline(smp_processor_id())) |
1336 | return now + NEXT_TIMER_MAX_DELTA; | 1336 | return expires; |
1337 | |||
1337 | spin_lock(&base->lock); | 1338 | spin_lock(&base->lock); |
1338 | if (time_before_eq(base->next_timer, base->timer_jiffies)) | 1339 | if (base->active_timers) { |
1339 | base->next_timer = __next_timer_interrupt(base); | 1340 | if (time_before_eq(base->next_timer, base->timer_jiffies)) |
1340 | expires = base->next_timer; | 1341 | base->next_timer = __next_timer_interrupt(base); |
1342 | expires = base->next_timer; | ||
1343 | } | ||
1341 | spin_unlock(&base->lock); | 1344 | spin_unlock(&base->lock); |
1342 | 1345 | ||
1343 | if (time_before_eq(expires, now)) | 1346 | if (time_before_eq(expires, now)) |