@@ -895,6 +895,9 @@ static void __remove_hrtimer(struct hrtimer *timer,
next_timer = timerqueue_getnext(&base->active);
timerqueue_del(&base->active, &timer->node);
+ if (!timerqueue_getnext(&base->active))
+ base->cpu_base->active_bases &= ~(1 << base->index);
+
#ifdef CONFIG_HIGH_RES_TIMERS
/* Reprogram the clock event device. if enabled */
if (reprogram && base->cpu_base->hres_active &&
@@ -907,8 +910,6 @@ static void __remove_hrtimer(struct hrtimer *timer,
}
#endif
timer->state = newstate;
- if (!timerqueue_getnext(&base->active))
- base->cpu_base->active_bases &= ~(1 << base->index);
}
/*
Timers are removed from the red-black trees from __remove_hrtimer() and after removing timer from the tree, it calls hrtimer_force_reprogram() which might use value of cpu_base->active_bases. If the timer being removed is the last one on that clock base, then cpu_base->active_bases wouldn't give the right value, as there are no timers queued on the base but active base still marks it as active. So, clear entry from active_bases as soon as timer is removed. Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> --- kernel/hrtimer.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)