diff options
Diffstat (limited to 'kernel')
| -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)) |
