diff options
author | Jindong Yue <jindong.yue@nxp.com> | 2021-03-31 16:33:18 +0800 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2021-04-16 21:03:50 +0200 |
commit | 9c336c9935cff267470bb3aaa85c66fac194b650 (patch) | |
tree | bab94e9be90d594b1743c5bd98a89eed3f6cdf86 /kernel/time/tick-broadcast.c | |
parent | d7840aaadd6e84915866a8f0dab586f6107dadf1 (diff) | |
download | linux-stable-9c336c9935cff267470bb3aaa85c66fac194b650.tar.gz linux-stable-9c336c9935cff267470bb3aaa85c66fac194b650.tar.bz2 linux-stable-9c336c9935cff267470bb3aaa85c66fac194b650.zip |
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: Jindong Yue <jindong.yue@nxp.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20210331083318.21794-1-jindong.yue@nxp.com
Diffstat (limited to 'kernel/time/tick-broadcast.c')
-rw-r--r-- | kernel/time/tick-broadcast.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index 6ec7855ab88d..a44055228796 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c @@ -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,8 +128,7 @@ 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(); + tick_clock_notify(); } /* |