Commit 9c336c99 authored by Jindong Yue's avatar Jindong Yue Committed by Thomas Gleixner
Browse files

tick/broadcast: Allow late registered device to enter oneshot mode



The broadcast device is switched to oneshot mode when the system switches
to oneshot mode. If a broadcast clock event device is registered after the
system switched to oneshot mode, it will stay in periodic mode forever.

Ensure that a late registered device which is selected as broadcast device
is initialized in oneshot mode when the system already uses oneshot mode.

[ tglx: Massage changelog ]

Signed-off-by: default avatarJindong Yue <jindong.yue@nxp.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20210331083318.21794-1-jindong.yue@nxp.com
parent d7840aaa
Loading
Loading
Loading
Loading
+14 −2
Original line number Diff line number Diff line
@@ -107,6 +107,19 @@ void tick_install_broadcast_device(struct clock_event_device *dev)
	tick_broadcast_device.evtdev = dev;
	if (!cpumask_empty(tick_broadcast_mask))
		tick_broadcast_start_periodic(dev);

	if (!(dev->features & CLOCK_EVT_FEAT_ONESHOT))
		return;

	/*
	 * If the system already runs in oneshot mode, switch the newly
	 * registered broadcast device to oneshot mode explicitly.
	 */
	if (tick_broadcast_oneshot_active()) {
		tick_broadcast_switch_to_oneshot();
		return;
	}

	/*
	 * Inform all cpus about this. We might be in a situation
	 * where we did not switch to oneshot mode because the per cpu
@@ -115,7 +128,6 @@ 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)
	tick_clock_notify();
}