From: Thomas Gleixner <tglx@kernel.org>
To: Mani Tofigh via B4 Relay <devnull+mt4022.columbia.edu@kernel.org>,
John Stultz <jstultz@google.com>
Cc: Stephen Boyd <sboyd@kernel.org>,
Miroslav Lichvar <mlichvar@redhat.com>,
Srikanth Aithal <Srikanth.Aithal@amd.com>,
Borislav Petkov <bp@alien8.de>,
K Prateek Nayak <kprateek.nayak@amd.com>,
linux-kernel@vger.kernel.org, tz2294@columbia.edu,
stable@vger.kernel.org, Mani Tofigh <mt4022@columbia.edu>
Subject: Re: [PATCH] clocksource: Use the clocksource under test for the skew check timeout
Date: Tue, 03 Nov 2026 21:20:49 +0100 [thread overview]
Message-ID: <878q39y8da.ffs@fw13> (raw)
In-Reply-To: <20261102-clocksource-skew-timeout-v1-1-4ff412918591@columbia.edu>
On Mon, Nov 02 2026 at 16:45, Mani Tofigh via wrote:
> watchdog_check_skew() waits for the remote CPU with interrupts disabled
> and gives up after a timeout measured with ktime_get_raw_fast_ns().
> While the clocksource is still jiffies during boot (or with
> clocksource=jiffies) that timeout can't expire, because only the boot
> CPU's tick advances jiffies and that's the CPU spinning with interrupts
> disabled.
>
> The boot then hangs when the remote CPU can't answer, eg in the
> stop_machine() of the switch away from jiffies:
>
> CPU0 CPU1
> multi_cpu_stop() multi_cpu_stop()
> local_irq_disable()
> /* waits for CPU0 */
> <timer interrupt>
> clocksource_watchdog()
> /* sends CSD to CPU1 */
> watchdog_check_skew()
> /* waits for CPU1 forever */
>
> Nothing gets printed. With the hard lockup detector on in a KVM guest:
The above explanation is enough. No need for this backtrace.
> Measure the timeout with the clocksource under test instead, which
> keeps counting with interrupts disabled. With the fix, the watchdog
> gives up after the timeout and the boot goes on. A 2-vCPU guest on one
> host core hung in 4 of 150 boots without it, and it didn't hang at all
> in 400 tests with the fix applied.
>
> This bug was identified and confirmed with the help of a deterministic
> hypervisor currently under development. The C reproducer below however
> hits it within about 80s on a kernel booted with clocksource=jiffies.
>
> Fixes: 763aacf86f1b ("clocksource: Rewrite watchdog code completely")
> Cc: stable@vger.kernel.org
> Signed-off-by: Mani Tofigh <mt4022@columbia.edu>
> ---
> Srikanth reported silent early boot hangs of large KVM guests that he
> bisected to the same commit [1]. I think it's the same bug but it was
> never confirmed. Srikanth, would you mind giving this a try on your
> setup?
Yes. I gave him a similar patch which simply uses sched_clock()
instead. That solves the problem, but I was reluctant to post it due to
the lack of explanation why this ends up in a situation which does not
allow to make progress.
So your reproducer does:
while true; do echo 0 >/sys/devices/system/cpu/cpu1/online; echo 1 >/sys/devices/system/cpu/cpu1/online; done
right?
Unfortunately it does not reproduce here within a reasonable amount of
time (still going strong after one hour...).
But yes, your explanation makes sense and triggering it with the hotplug
code is obviously a matter of probability.
Though one thing I thought about before looking at your mail while
reasoning over the possible causes of Srikanth's report and the possible
consequences is that such a timeout might in the worst case result in a
stale CPU state which is silently ignored. The consequence is that the
watchdog wont run on a CPU with such state ever again.
So something like the below delta patch on top of your fix (or the
sched_clock()) variant might be appropriate.
Can you and Srikanth please run that on top to validate that we don't
end up with that?
Thanks,
tglx
---
--- a/kernel/time/clocksource.c
+++ b/kernel/time/clocksource.c
@@ -250,6 +250,7 @@ enum wd_result {
WD_FREQ_RESET,
WD_FREQ_SKEWED,
WD_CPU_TIMEOUT,
+ WD_CPU_STALLED,
WD_CPU_SKEWED,
};
@@ -398,7 +399,7 @@ static void __watchdog_check_cpu_skew(st
wd = per_cpu_ptr(&watchdog_cpu_data, cpu);
if (atomic_read(&wd->remote_inprogress) || wd_csd_locked(wd)) {
- watchdog_data.result = WD_CPU_TIMEOUT;
+ watchdog_data.result = WD_CPU_STALLED;
return;
}
@@ -590,11 +591,16 @@ static void watchdog_print_freq_skew(str
pr_warn("Clocksource %20s interval: %16lluns\n", cs->name, watchdog_data.cs_delta);
}
-static void watchdog_handle_remote_timeout(struct clocksource *cs)
+static void watchdog_print_remote_timeout(struct clocksource *cs)
{
pr_info_once("Watchdog remote CPU %u read timed out\n", watchdog_data.curr_cpu);
}
+static void watchdog_print_remote_stall(struct clocksource *cs)
+{
+ pr_warn("Watchdog remote CPU %u stalled\n", watchdog_data.curr_cpu);
+}
+
static void watchdog_print_remote_skew(struct clocksource *cs)
{
pr_warn("Marking clocksource %s unstable due to inter CPU skew\n", cs->name);
@@ -635,9 +641,13 @@ static void watchdog_check_result(struct
case WD_CPU_TIMEOUT:
/* Remote check timed out. Try again next cycle. */
- watchdog_handle_remote_timeout(cs);
+ watchdog_print_remote_timeout(cs);
return;
+ case WD_CPU_STALLED:
+ watchdog_print_remote_stall(cs);
+ break;
+
case WD_CPU_SKEWED:
watchdog_print_remote_skew(cs);
break;
next prev parent reply other threads:[~2026-11-03 20:20 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-02 21:45 Mani Tofigh via B4 Relay
2026-11-03 20:20 ` Thomas Gleixner [this message]
2026-11-04 10:38 ` Aithal, Srikanth
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=878q39y8da.ffs@fw13 \
--to=tglx@kernel.org \
--cc=Srikanth.Aithal@amd.com \
--cc=bp@alien8.de \
--cc=devnull+mt4022.columbia.edu@kernel.org \
--cc=jstultz@google.com \
--cc=kprateek.nayak@amd.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mlichvar@redhat.com \
--cc=mt4022@columbia.edu \
--cc=sboyd@kernel.org \
--cc=stable@vger.kernel.org \
--cc=tz2294@columbia.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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®