Broadcast device is switched to oneshot mode in hrtimer_switch_to_hres() -> tick_broadcast_switch_to_oneshot(). After high resolution timers are enabled, new installed broadcast device has no chance to switch mode.
This issue happens in below situation: In order to make broadcast clock source driver build as module, use module_platform_driver() to replace TIMER_OF_DECLARE(). This will make clock source driver probed later than high resolution timers enabled. Signed-off-by: Jindong Yue <jindong....@nxp.com> --- kernel/time/tick-broadcast.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index e51778c312f1..f38a7544cb5b 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c @@ -47,6 +47,7 @@ static inline void tick_resume_broadcast_oneshot(struct clock_event_device *bc) static inline void tick_broadcast_oneshot_offline(unsigned int cpu) { } # endif #endif +static void tick_handle_oneshot_broadcast(struct clock_event_device *dev); /* * Debugging: see timer_list.c @@ -115,8 +116,20 @@ void tick_install_broadcast_device(struct clock_event_device *dev) * notification the systems stays stuck in periodic mode * forever. */ - if (dev->features & CLOCK_EVT_FEAT_ONESHOT) + if (dev->features & CLOCK_EVT_FEAT_ONESHOT) { tick_clock_notify(); + + /* + * If new broadcast device is installed after high resolution + * timers enabled, it can not switch to oneshot mode anymore. + * Here give it a chance. + */ + if (tick_broadcast_oneshot_active() && + dev->event_handler != tick_handle_oneshot_broadcast) { + tick_broadcast_switch_to_oneshot(); + } + } + } /* -- 2.17.1