aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/hrtimer.c
diff options
context:
space:
mode:
authorJohn Stultz <john.stultz@linaro.org>2010-12-11 01:19:53 -0500
committerJohn Stultz <john.stultz@linaro.org>2010-12-11 01:19:53 -0500
commitb007c389d3e09b823eccda1503390fa2a9adca0d (patch)
tree34431af3282f6b3892e092cc77b507a92a66724e /kernel/hrtimer.c
parent998adc3dda59f811966b3ccb21eb223680b25ec4 (diff)
hrtimer: fix timerqueue conversion flub
In converting the hrtimers to timerqueue, I missed a spot in hrtimer_run_queues where we loop running timers. We end up not pulling the new next value out and instead just use the last next value, causing boot time hangs in some cases. The proper fix is to pull timerqueue_getnext each iteration instead of using a local next value. Reported-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: John Stultz <john.stultz@linaro.org>
Diffstat (limited to 'kernel/hrtimer.c')
-rw-r--r--kernel/hrtimer.c7
1 files changed, 2 insertions, 5 deletions
diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c
index 93976ad42f5a..7a7a2061c24d 100644
--- a/kernel/hrtimer.c
+++ b/kernel/hrtimer.c
@@ -1412,11 +1412,8 @@ void hrtimer_run_queues(void)
1412 return; 1412 return;
1413 1413
1414 for (index = 0; index < HRTIMER_MAX_CLOCK_BASES; index++) { 1414 for (index = 0; index < HRTIMER_MAX_CLOCK_BASES; index++) {
1415 struct timerqueue_node *next;
1416
1417 base = &cpu_base->clock_base[index]; 1415 base = &cpu_base->clock_base[index];
1418 next = timerqueue_getnext(&base->active); 1416 if (!timerqueue_getnext(&base->active))
1419 if (!next)
1420 continue; 1417 continue;
1421 1418
1422 if (gettime) { 1419 if (gettime) {
@@ -1426,7 +1423,7 @@ void hrtimer_run_queues(void)
1426 1423
1427 raw_spin_lock(&cpu_base->lock); 1424 raw_spin_lock(&cpu_base->lock);
1428 1425
1429 while ((node = next)) { 1426 while ((node = timerqueue_getnext(&base->active))) {
1430 struct hrtimer *timer; 1427 struct hrtimer *timer;
1431 1428
1432 timer = container_of(node, struct hrtimer, node); 1429 timer = container_of(node, struct hrtimer, node);