diff mbox

[V2,22/36] hrtimer: clear active_bases as soon as the timer is removed

Message ID 31d5cab755a1401e8c5e0b5041087c889f804693.1396592516.git.viresh.kumar@linaro.org
State New
Headers show

Commit Message

Viresh Kumar April 4, 2014, 6:36 a.m. UTC
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(-)
diff mbox

Patch

diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c
index 2d5bb9d..379d21a 100644
--- a/kernel/hrtimer.c
+++ b/kernel/hrtimer.c
@@ -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);
 }
 
 /*