Skip to content

Commit f723aa1

Browse files
bebarinoKAGA-KOKO
authored andcommitted
sched_clock: Avoid corrupting hrtimer tree during suspend
During suspend we call sched_clock_poll() to update the epoch and accumulated time and reprogram the sched_clock_timer to fire before the next wrap-around time. Unfortunately, sched_clock_poll() doesn't restart the timer, instead it relies on the hrtimer layer to do that and during suspend we aren't calling that function from the hrtimer layer. Instead, we're reprogramming the expires time while the hrtimer is enqueued, which can cause the hrtimer tree to be corrupted. Furthermore, we restart the timer during suspend but we update the epoch during resume which seems counter-intuitive. Let's fix this by saving the accumulated state and canceling the timer during suspend. On resume we can update the epoch and restart the timer similar to what we would do if we were starting the clock for the first time. Fixes: a08ca5d "sched_clock: Use an hrtimer instead of timer" Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> Signed-off-by: John Stultz <john.stultz@linaro.org> Link: http://lkml.kernel.org/r/1406174630-23458-1-git-send-email-john.stultz@linaro.org Cc: Ingo Molnar <mingo@kernel.org> Cc: stable <stable@vger.kernel.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
1 parent 82e13c7 commit f723aa1

File tree

1 file changed

+3
-1
lines changed

1 file changed

+3
-1
lines changed

kernel/time/sched_clock.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,14 +191,16 @@ void __init sched_clock_postinit(void)
191191

192192
static int sched_clock_suspend(void)
193193
{
194-
sched_clock_poll(&sched_clock_timer);
194+
update_sched_clock();
195+
hrtimer_cancel(&sched_clock_timer);
195196
cd.suspended = true;
196197
return 0;
197198
}
198199

199200
static void sched_clock_resume(void)
200201
{
201202
cd.epoch_cyc = read_sched_clock();
203+
hrtimer_start(&sched_clock_timer, cd.wrap_kt, HRTIMER_MODE_REL);
202204
cd.suspended = false;
203205
}
204206

0 commit comments

Comments
 (0)