* [PATCH clocksource] Defer marking clocksources unstable to kthread
@ 2025-03-05 17:43 Paul E. McKenney
2025-03-06 8:25 ` Thomas Gleixner
0 siblings, 1 reply; 3+ messages in thread
From: Paul E. McKenney @ 2025-03-05 17:43 UTC (permalink / raw)
To: linux-kernel; +Cc: jstultz, tglx, sboyd, christian, kernel-team
The clocksource watchdog marks clocksources unstable from within a timer
handler. On x86, this marking involves an on_each_cpu_cond_mask(),
which in turn invokes smp_call_function_many_cond(), which may not be
invoked from a timer handler. Doing so results in:
WARNING: CPU: 3 PID: 0 at kernel/smp.c:815 smp_call_function_many_cond+0x46b/0x4c0
Fix this by deferring the marking to the clocksource watchdog kthread.
Note that marking unstable is already deferred, so deferring it a bit
more should be just fine.
Reported-by: Christian Heusel <christian@heusel.eu>
Closes: https://lore.kernel.org/all/46a200b4-1293-413c-8b73-37f7b50abd1a@heusel.eu/
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
Cc: John Stultz <jstultz@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Stephen Boyd <sboyd@kernel.org>
---
include/linux/clocksource.h | 1 +
kernel/time/clocksource.c | 16 ++++++++++++----
2 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h
index 65b7c41471c39..a5317a4c07990 100644
--- a/include/linux/clocksource.h
+++ b/include/linux/clocksource.h
@@ -149,6 +149,7 @@ struct clocksource {
#define CLOCK_SOURCE_SUSPEND_NONSTOP 0x80
#define CLOCK_SOURCE_RESELECT 0x100
#define CLOCK_SOURCE_VERIFY_PERCPU 0x200
+#define CLOCK_SOURCE_DEFERRED_UNSTABLE 0x400
/* simplify initialization of mask field */
#define CLOCKSOURCE_MASK(bits) GENMASK_ULL((bits) - 1, 0)
diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c
index 7304d7cf47f2d..60ace6f64c761 100644
--- a/kernel/time/clocksource.c
+++ b/kernel/time/clocksource.c
@@ -201,7 +201,8 @@ static void clocksource_change_rating(struct clocksource *cs, int rating)
static void __clocksource_unstable(struct clocksource *cs)
{
- cs->flags &= ~(CLOCK_SOURCE_VALID_FOR_HRES | CLOCK_SOURCE_WATCHDOG);
+ cs->flags &= ~(CLOCK_SOURCE_VALID_FOR_HRES | CLOCK_SOURCE_WATCHDOG |
+ CLOCK_SOURCE_DEFERRED_UNSTABLE);
cs->flags |= CLOCK_SOURCE_UNSTABLE;
/*
@@ -215,6 +216,11 @@ static void __clocksource_unstable(struct clocksource *cs)
if (cs->mark_unstable)
cs->mark_unstable(cs);
+}
+
+static void __clocksource_deferred_unstable(struct clocksource *cs)
+{
+ cs->flags |= CLOCK_SOURCE_DEFERRED_UNSTABLE;
/* kick clocksource_watchdog_kthread() */
if (finished_booting)
@@ -236,7 +242,7 @@ void clocksource_mark_unstable(struct clocksource *cs)
if (!(cs->flags & CLOCK_SOURCE_UNSTABLE)) {
if (!list_empty(&cs->list) && list_empty(&cs->wd_list))
list_add(&cs->wd_list, &watchdog_list);
- __clocksource_unstable(cs);
+ __clocksource_deferred_unstable(cs);
}
spin_unlock_irqrestore(&watchdog_lock, flags);
}
@@ -453,7 +459,7 @@ static void clocksource_watchdog(struct timer_list *unused)
if (read_ret == WD_READ_UNSTABLE) {
/* Clock readout unreliable, so give it up. */
- __clocksource_unstable(cs);
+ __clocksource_deferred_unstable(cs);
continue;
}
@@ -538,7 +544,7 @@ static void clocksource_watchdog(struct timer_list *unused)
pr_warn(" '%s' (not '%s') is current clocksource.\n", curr_clocksource->name, cs->name);
else
pr_warn(" No current clocksource.\n");
- __clocksource_unstable(cs);
+ __clocksource_deferred_unstable(cs);
continue;
}
@@ -703,6 +709,8 @@ static int __clocksource_watchdog_kthread(void)
spin_lock_irqsave(&watchdog_lock, flags);
list_for_each_entry_safe(cs, tmp, &watchdog_list, wd_list) {
+ if (cs->flags & CLOCK_SOURCE_DEFERRED_UNSTABLE)
+ __clocksource_unstable(cs);
if (cs->flags & CLOCK_SOURCE_UNSTABLE) {
list_del_init(&cs->wd_list);
clocksource_change_rating(cs, 0);
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH clocksource] Defer marking clocksources unstable to kthread
2025-03-05 17:43 [PATCH clocksource] Defer marking clocksources unstable to kthread Paul E. McKenney
@ 2025-03-06 8:25 ` Thomas Gleixner
2025-03-06 16:06 ` Paul E. McKenney
0 siblings, 1 reply; 3+ messages in thread
From: Thomas Gleixner @ 2025-03-06 8:25 UTC (permalink / raw)
To: paulmck, linux-kernel; +Cc: jstultz, sboyd, christian, kernel-team
Paul!
On Wed, Mar 05 2025 at 09:43, Paul E. McKenney wrote:
I'm pretty sure, that I pointed this out to you before:
"[PATCH subsys] Short description"
is not a valid subject line.
The canonical and documented form is:
[PATCH] subsys: Short description
Can you please stop making your own rules and thereby breaking the
automated workflow of people so they have to manually fix up your stuff?
Thanks,
tglx
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH clocksource] Defer marking clocksources unstable to kthread
2025-03-06 8:25 ` Thomas Gleixner
@ 2025-03-06 16:06 ` Paul E. McKenney
0 siblings, 0 replies; 3+ messages in thread
From: Paul E. McKenney @ 2025-03-06 16:06 UTC (permalink / raw)
To: Thomas Gleixner; +Cc: linux-kernel, jstultz, sboyd, christian, kernel-team
On Thu, Mar 06, 2025 at 09:25:19AM +0100, Thomas Gleixner wrote:
> Paul!
>
> On Wed, Mar 05 2025 at 09:43, Paul E. McKenney wrote:
>
> I'm pretty sure, that I pointed this out to you before:
>
> "[PATCH subsys] Short description"
>
> is not a valid subject line.
>
> The canonical and documented form is:
>
> [PATCH] subsys: Short description
>
> Can you please stop making your own rules and thereby breaking the
> automated workflow of people so they have to manually fix up your stuff?
Apologies!
I do not recall being chastised on this particular issue, but I clearly
do need to reread submittingpatches.rst more often.
I have adjusted my scripts for this particular issue and will resend v2
of this patch.
Thanx, Paul
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-03-06 16:06 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-05 17:43 [PATCH clocksource] Defer marking clocksources unstable to kthread Paul E. McKenney
2025-03-06 8:25 ` Thomas Gleixner
2025-03-06 16:06 ` Paul E. McKenney
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.