timers, sched_clock: Update timeout for clock wrap
PATCH 1/1 timers, sched_clock: Update timeout for clock wrap
The scheduler clock framework may not use the correct timeout for the clock wrap. This happens when a new clock driver calls sched_clock_register() after the kernel called sched_clock_postinit(). In this case the clock wrap timeout is too long thus sched_clock_poll() is called too late and the clock already wrapped.
On my ARM system the scheduler was no longer scheduling any other task than the idle task because the sched_clock() wrapped.
--- kernel/time/sched_clock.c | 5 +++++ 1 file changed, 5 insertions(+)
kernel/time/sched_clock.c +5 -0
@@ -205,6 +205,11 @@ sched_clock_register(u64 (*read)(void), int bits, unsigned long rate)update_clock_read_data (&rd); +if (sched_clock_timer.function !=NULL ) { +/* update timeout for clock wrap */ +hrtimer_start (&sched_clock_timer, cd.wrap_kt,HRTIMER_MODE_REL ); + } + r = rate;if (r >=4000000 ) { r /=1000000 ;
Signature · 1 line
2.9.3
PATCH RESEND 1/1 timers, sched_clock: Update timeout for clock wrap
The scheduler clock framework may not use the correct timeout for the clock wrap. This happens when a new clock driver calls sched_clock_register() after the kernel called sched_clock_postinit(). In this case the clock wrap timeout is too long thus sched_clock_poll() is called too late and the clock already wrapped.
On my ARM system the scheduler was no longer scheduling any other task than the idle task because the sched_clock() wrapped.
--- kernel/time/sched_clock.c | 5 +++++ 1 file changed, 5 insertions(+)
kernel/time/sched_clock.c +5 -0
@@ -205,6 +205,11 @@ sched_clock_register(u64 (*read)(void), int bits, unsigned long rate)update_clock_read_data (&rd); +if (sched_clock_timer.function !=NULL ) { +/* update timeout for clock wrap */ +hrtimer_start (&sched_clock_timer, cd.wrap_kt,HRTIMER_MODE_REL ); + } + r = rate;if (r >=4000000 ) { r /=1000000 ;
Signature · 1 line
2.9.3
Quoted 10 lines · David Engraf
The scheduler clock framework may not use the correct timeout for the clock wrap. This happens when a new clock driver calls
sched_clock_register()after the kernel calledsched_clock_postinit(). In this case the clock wrap timeout is too long thussched_clock_poll()is called too late and the clock already wrapped.On my ARM system the scheduler was no longer scheduling any other task than the idle task because the
sched_clock()wrapped.Signed-off-by David Engraf <[email protected]>
Thanks for sending this in! It looks sane, so I've queued it.
thanks
-john