mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH v1 0/7] Setting the scene to convert the timers into modules
@ 2025-06-02 15:18 Daniel Lezcano
  2025-06-02 15:18 ` [PATCH v1 1/7] clocksource/drivers/scx200: Add module owner Daniel Lezcano
                   ` (8 more replies)
  0 siblings, 9 replies; 35+ messages in thread
From: Daniel Lezcano @ 2025-06-02 15:18 UTC (permalink / raw)
  To: daniel.lezcano, tglx
  Cc: Jim Cromie, Maxime Coquelin, Alexandre Torgue, Chen-Yu Tsai,
	Jernej Skrabec, Samuel Holland, Thierry Reding, Jonathan Hunter,
	Peter Zijlstra (Intel),
	Marco Elver, Nam Cao, linux-kernel, linux-stm32,
	linux-arm-kernel, linux-sunxi, linux-tegra, John Stulz,
	Will McVicker, Peter Griffin, Saravan Kanna

The timer drivers are all compiled-in. The initial pre-requisite is to
have them available as soon as possible in the boot process. While
this statement made sense a long time ago, the platforms have today
multiple timers for different purposes along with architected timers
which are initialized very early. For example, a timer can be used as
a backup timer when the local timers are belonging to a power domain
which is shutted down, or used a watchdog timer when the counter are
shared, or also as a pulse width modulation counter. Another use case
is the platform user may want to switch to a timer different from the
architected timers because they have interesting characteristics in
the context of a dedicated platform (eg. automotive).

In some existing drivers, there is already the code to load and unload
a timer driver even if the Kconfig does not allow that. It means, the
need is there but partially upstream.

There were multiple attempts to configure the timer drivers into
modules but it faced the fact that we were unsure if it is correctly
supported by the time framework.

After investigating deeper in the core code it appears we have
everything set for the modularization of the timer drivers.

 - When a clocksource is registered with a better rating, the current
   clocksource is swapped with the new one. The userspace allows to
   change the current clocksource via sysfs

 - A clocksource can be unregistered

 - When a clockevent is registered with a better rating, it becomes
   the active one

 - A clockevent can not be unregistered

A timer driver can be loaded later because of all the supported
above. However unloading is unsupported because a clockevent can not
be unregistered and that will lead to a crash.

But if the timer driver has the module owner set, the core framework
will handle the refcount correctly and will prevent to unload the
module if a clockevent is registered. All the refcounting is working
in different use cases.

 - A clocksource is the current clocksource, the refcount is held

 - A current clocksource is switched to another one, the refcount is
   released

 - A broadcast timer is registered, the refcount is held

 - A local timer is registered, the refcount is held

Consequently, it is possible to unload a module which is only used as
a clocksource. As soon as a clockevent is registered, the refcount is
held and can not be released thus preventing the module to be
unloaded.

That mechanism ensure it is safe to convert the different timer
drivers into modules.

This series adds the module owner in the different driver which are
initialized with the module_platform_driver() function and export the
symbols for the sched_clock_register() function.

Cc: Jim Cromie <jim.cromie@gmail.com>
Cc: Daniel Lezcano <daniel.lezcano@linaro.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Maxime Coquelin <mcoquelin.stm32@gmail.com>
Cc: Alexandre Torgue <alexandre.torgue@foss.st.com>
Cc: Chen-Yu Tsai <wens@csie.org>
Cc: Jernej Skrabec <jernej.skrabec@gmail.com>
Cc: Samuel Holland <samuel@sholland.org>
Cc: Thierry Reding <thierry.reding@gmail.com>
Cc: Jonathan Hunter <jonathanh@nvidia.com>
Cc: "Peter Zijlstra (Intel)" <peterz@infradead.org>
Cc: Marco Elver <elver@google.com>
Cc: Nam Cao <namcao@linutronix.de>
Cc: linux-kernel@vger.kernel.org
Cc: linux-stm32@st-md-mailman.stormreply.com
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-sunxi@lists.linux.dev
Cc: linux-tegra@vger.kernel.org
Cc: John Stulz <jstultz@google.com>
Cc: Will McVicker <willmcvicker@google.com>
Cc: Peter Griffin <peter.griffin@linaro.org>
Cc: Saravan Kanna <saravanak@google.com>


Daniel Lezcano (7):
  clocksource/drivers/scx200: Add module owner
  clocksource/drivers/stm32-lp: Add module owner
  clocksource/drivers/sun5i: Add module owner
  clocksource/drivers/tegra186: Add module owner
  clocksource/drivers/stm: Add module owner
  clocksource/drivers/cs5535: Add module owner
  time: Export symbol for sched_clock register function

 drivers/clocksource/scx200_hrt.c     | 1 +
 drivers/clocksource/timer-cs5535.c   | 1 +
 drivers/clocksource/timer-nxp-stm.c  | 2 ++
 drivers/clocksource/timer-stm32-lp.c | 1 +
 drivers/clocksource/timer-sun5i.c    | 2 ++
 drivers/clocksource/timer-tegra186.c | 3 +++
 kernel/time/sched_clock.c            | 4 ++--
 7 files changed, 12 insertions(+), 2 deletions(-)

-- 
2.43.0


^ permalink raw reply	[flat|nested] 35+ messages in thread
* [tip: timers/clocksource] clocksource/drivers/tegra186: Add module owner
@ 2025-09-25 21:33 tip-bot2 for Daniel Lezcano
  0 siblings, 0 replies; 35+ messages in thread
From: tip-bot2 for Daniel Lezcano @ 2025-09-25 21:33 UTC (permalink / raw)
  To: linux-tip-commits; +Cc: Daniel Lezcano, Will McVicker, x86, linux-kernel

The following commit has been merged into the timers/clocksource branch of tip:

Commit-ID:     afe904f5091e2ceaa95b451f61a115a0224e8e38
Gitweb:        https://git.kernel.org/tip/afe904f5091e2ceaa95b451f61a115a0224e8e38
Author:        Daniel Lezcano <daniel.lezcano@linaro.org>
AuthorDate:    Mon, 02 Jun 2025 17:18:48 +02:00
Committer:     Daniel Lezcano <daniel.lezcano@linaro.org>
CommitterDate: Tue, 23 Sep 2025 10:52:04 +02:00

clocksource/drivers/tegra186: Add module owner

The conversion to modules requires a correct handling of the module
refcount in order to prevent to unload it if it is in use. That is
especially true with the clockevents where there is no function to
unregister them.

The core time framework correctly handles the module refcount with the
different clocksource and clockevents if the module owner is set.

Add the module owner to make sure the core framework will prevent
stupid things happening when the driver will be converted into a
module.

Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
Reviewed-by: Will McVicker <willmcvicker@google.com>
Link: https://lore.kernel.org/r/20250602151853.1942521-5-daniel.lezcano@linaro.org
---
 drivers/clocksource/timer-tegra186.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/clocksource/timer-tegra186.c b/drivers/clocksource/timer-tegra186.c
index e5394f9..56a5342 100644
--- a/drivers/clocksource/timer-tegra186.c
+++ b/drivers/clocksource/timer-tegra186.c
@@ -373,6 +373,7 @@ static int tegra186_timer_tsc_init(struct tegra186_timer *tegra)
 	tegra->tsc.read = tegra186_timer_tsc_read;
 	tegra->tsc.mask = CLOCKSOURCE_MASK(56);
 	tegra->tsc.flags = CLOCK_SOURCE_IS_CONTINUOUS;
+	tegra->tsc.owner = THIS_MODULE;
 
 	return clocksource_register_hz(&tegra->tsc, 31250000);
 }
@@ -392,6 +393,7 @@ static int tegra186_timer_osc_init(struct tegra186_timer *tegra)
 	tegra->osc.read = tegra186_timer_osc_read;
 	tegra->osc.mask = CLOCKSOURCE_MASK(32);
 	tegra->osc.flags = CLOCK_SOURCE_IS_CONTINUOUS;
+	tegra->osc.owner = THIS_MODULE;
 
 	return clocksource_register_hz(&tegra->osc, 38400000);
 }
@@ -411,6 +413,7 @@ static int tegra186_timer_usec_init(struct tegra186_timer *tegra)
 	tegra->usec.read = tegra186_timer_usec_read;
 	tegra->usec.mask = CLOCKSOURCE_MASK(32);
 	tegra->usec.flags = CLOCK_SOURCE_IS_CONTINUOUS;
+	tegra->usec.owner = THIS_MODULE;
 
 	return clocksource_register_hz(&tegra->usec, USEC_PER_SEC);
 }

^ permalink raw reply	[flat|nested] 35+ messages in thread

end of thread, other threads:[~2025-09-25 21:33 UTC | newest]

Thread overview: 35+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-06-02 15:18 [PATCH v1 0/7] Setting the scene to convert the timers into modules Daniel Lezcano
2025-06-02 15:18 ` [PATCH v1 1/7] clocksource/drivers/scx200: Add module owner Daniel Lezcano
2025-06-03 17:48   ` William McVicker
2025-07-23  7:17   ` [tip: timers/clocksource] " tip-bot2 for Daniel Lezcano
2025-07-25 10:31   ` tip-bot2 for Daniel Lezcano
2025-06-02 15:18 ` [PATCH v1 2/7] clocksource/drivers/stm32-lp: " Daniel Lezcano
2025-06-03 17:54   ` William McVicker
2025-07-23  7:17   ` [tip: timers/clocksource] " tip-bot2 for Daniel Lezcano
2025-07-25 10:31   ` tip-bot2 for Daniel Lezcano
2025-06-02 15:18 ` [PATCH v1 3/7] clocksource/drivers/sun5i: " Daniel Lezcano
2025-06-03  4:41   ` Chen-Yu Tsai
2025-06-03 17:55   ` William McVicker
2025-07-23  7:17   ` [tip: timers/clocksource] " tip-bot2 for Daniel Lezcano
2025-07-25 10:31   ` tip-bot2 for Daniel Lezcano
2025-06-02 15:18 ` [PATCH v1 4/7] clocksource/drivers/tegra186: " Daniel Lezcano
2025-06-03 17:57   ` William McVicker
2025-07-23  7:17   ` [tip: timers/clocksource] " tip-bot2 for Daniel Lezcano
2025-07-25 10:31   ` tip-bot2 for Daniel Lezcano
2025-06-02 15:18 ` [PATCH v1 5/7] clocksource/drivers/stm: " Daniel Lezcano
2025-06-03 17:59   ` William McVicker
2025-07-23  7:17   ` [tip: timers/clocksource] " tip-bot2 for Daniel Lezcano
2025-07-25 10:31   ` tip-bot2 for Daniel Lezcano
2025-06-02 15:18 ` [PATCH v1 6/7] clocksource/drivers/cs5535: " Daniel Lezcano
2025-06-03 18:00   ` William McVicker
2025-07-23  7:17   ` [tip: timers/clocksource] " tip-bot2 for Daniel Lezcano
2025-07-25 10:31   ` tip-bot2 for Daniel Lezcano
2025-06-02 15:18 ` [PATCH v1 7/7] time: Export symbol for sched_clock register function Daniel Lezcano
2025-06-03 18:01   ` William McVicker
2025-06-04  3:43   ` John Stultz
2025-06-04  9:25   ` Thomas Gleixner
2025-07-23  7:17   ` [tip: timers/clocksource] time/sched_clock: " tip-bot2 for Daniel Lezcano
2025-07-25 10:31   ` [tip: timers/clocksource] time/sched_clock: Export symbol for sched_clock_register() function tip-bot2 for Daniel Lezcano
2025-06-03 18:04 ` [PATCH v1 0/7] Setting the scene to convert the timers into modules William McVicker
2025-08-13 13:00 ` Daniel Lezcano
2025-09-25 21:33 [tip: timers/clocksource] clocksource/drivers/tegra186: Add module owner tip-bot2 for Daniel Lezcano

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®