From: Stian Halseth <stian@itx.no>
To: tglx@kernel.org, andreas@gaisler.com, davem@davemloft.net,
sparclinux@vger.kernel.org
Cc: Tony Rodriguez <unixpro1970@gmail.com>,
linux-kernel@vger.kernel.org, thomas.weissschuh@linutronix.de,
regressions@lists.linux.dev, glaubitz@physik.fu-berlin.de,
linux@leemhuis.info, torvalds@linux-foundation.org
Subject: Re: [PATCH v3] sparc64: Fix comparator problem with timer interrupts
Date: Tue, 29 Sep 2026 00:17:49 +0200 [thread overview]
Message-ID: <a1e1a8c88161894c8fcd4514900cf3a14232aa47.camel@itx.no> (raw)
In-Reply-To: <20260831180728.3097740-1-stian@itx.no>
[-- Attachment #1: Type: text/plain, Size: 5216 bytes --]
Hi,
I just got a SPARC T7-1 and have independent reproduction and
confirmation of the fix.
Without the patch the system is not really usable. I can just bring
down a network interface and that alone triggers a hang.
Hung on 3 out of 3 boots unpatched:
task:ip state:D
[<0000000000cfebc4>] wait_for_completion+0x64/0x180
[<0000000000509c30>] synchronize_rcu_normal+0x150/0x280
[<0000000010079060>] ixgbe_down+0x1a0/0x460 [ixgbe]
[<000000001007a4c8>] ixgbe_close+0xe8/0x100 [ixgbe]
[<0000000000af1cf8>] netif_change_flags+0x18/0x80
[<0000000000b08618>] rtnl_newlink+0x758/0xaa0
A second caller hit the same stall under kernel build load, from
network namespace teardown rather than any driver path:
task:kworker/u1024:0 state:D
Workqueue: netns cleanup_net
[<0000000000cfebc4>] wait_for_completion+0x64/0x180
[<0000000000504ab4>] rcu_barrier+0x214/0x480
[<0000000000af3f88>] netdev_run_todo+0x48/0x600
[<0000000000ad99c8>] cleanup_net+0x1c8/0x360
Both are plain RCU waits:
rcu: rcu_sched kthread timer wakeup didn't happen for 6002 jiffies!
g193 f0x0 RCU_GP_WAIT_FQS(5) ->state=0x402
rcu: Possible timer handling issue on cpu=20 timer-softirq=107
rcu: rcu_sched kthread starved for 6004 jiffies! ->cpu=20
With the patch applied: 3 boots with a clean first ifdown on each, plus
6 consecutive interface down/up cycles within one boot, and no stall or
hung-task messages in any of them.
Tested-by: Stian Halseth <stian@itx.no>
On Mon, 2026-08-31 at 20:07 +0200, Stian Halseth wrote:
> From: Tony Rodriguez <unixpro1970@gmail.com>
>
> The tick/stick/hbtick add_compare() implementations program the
> comparator and then check whether the write took effect in time:
>
> exp = read_cnt() + delta_ticks;
> write_cmp(exp);
> return (read_cnt() - exp) > 0;
>
> A nonzero return value means the expiry time was already reached
> before the comparator write could take effect, so the interrupt may
> never fire, and the caller retries with a new expiry:
>
> return tick.add_compare(delta_ticks) ? -ETIME : 0;
>
> The check only fails the write when the counter has advanced past the
> expiry time, but not when it is equal to it. In the equal case it is
> unknown whether the comparator write took effect before or after the
> counter reached the expiry value, so the compare match - and with it
> the timer interrupt - may have been missed. add_compare() then
> reports success, the caller does not retry, and the CPU is left with
> no pending timer interrupt.
>
> This results in stalled hrtimers and RCU stalls / hangs under load,
> observed on SPARC S7-2 and T7-1 systems:
>
> rcu: INFO: rcu_sched detected stalls on CPUs/tasks:
> rcu: rcu_sched kthread timer wakeup didn't happen for 5259
> jiffies!
> rcu: Possible timer handling issue on cpu=100 timer-
> softirq=15
>
> Treat counter == expiry as failure as well, so the caller retries
> with a new expiry time. After this change S7-2 and T7-1 systems no
> longer hang.
>
> Diagnosed-by: Thomas Gleixner <tglx@kernel.org>
> Link: https://lore.kernel.org/all/87tssb6olo.ffs@tglx/
> Link: https://lore.kernel.org/all/871pfcznw0.ffs@tglx/
> Link:
> https://lore.kernel.org/all/20260519022421.5978-1-unixpro1970@gmail.com/
> Signed-off-by: Tony Rodriguez <unixpro1970@gmail.com>
> [stian: rewrote the changelog per review of v2, retested]
> Signed-off-by: Stian Halseth <stian@itx.no>
> ---
> v3:
> - rewrite the changelog: describe the write/readback ordering and
> the
> direction of the equal-compare case per Thomas Gleixner's review
> https://lore.kernel.org/all/878q9fxywc.ffs@tglx/
> (the code change is identical to v2)
> - add the Link: tags to the original debugging discussion
> - picked up with Tony's agreement after v2 stalled
>
> https://lore.kernel.org/all/10382506-3f57-4b33-8356-34f23fb5f153@gmail.com/
>
> Tested on an UltraSPARC T4-1 (sun4v, stick variant): 9.1M hrtimer
> reprograms in 90s across 32 threads with 10-500us expiries, no
> stalls, no lost wakeups (worst oversleep 657us).
>
> arch/sparc/kernel/time_64.c | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/arch/sparc/kernel/time_64.c
> b/arch/sparc/kernel/time_64.c
> --- a/arch/sparc/kernel/time_64.c
> +++ b/arch/sparc/kernel/time_64.c
> @@ -146,7 +146,7 @@
> : "=r" (new_tick));
> new_tick &= ~TICKCMP_IRQ_BIT;
>
> - return ((long)(new_tick - (orig_tick+adj))) > 0L;
> + return ((long)(new_tick - (orig_tick+adj))) >= 0L;
> }
>
> static unsigned long tick_add_tick(unsigned long adj)
> @@ -277,7 +277,7 @@
> : "=r" (new_tick));
> new_tick &= ~TICKCMP_IRQ_BIT;
>
> - return ((long)(new_tick - (orig_tick+adj))) > 0L;
> + return ((long)(new_tick - (orig_tick+adj))) >= 0L;
> }
>
> static unsigned long stick_get_frequency(void)
> @@ -411,7 +411,7 @@
>
> val2 = __hbird_read_stick() & ~TICKCMP_IRQ_BIT;
>
> - return ((long)(val2 - val)) > 0L;
> + return ((long)(val2 - val)) >= 0L;
> }
>
> static unsigned long hbtick_get_frequency(void)
> --
> 2.53.0
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
next prev parent reply other threads:[~2026-09-28 22:17 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-19 2:24 [PATCH v2 1/1] " Tony Rodriguez
2026-05-19 2:24 ` Tony Rodriguez
2026-05-19 14:22 ` Thomas Gleixner
2026-05-19 23:25 ` Tony Rodriguez
2026-08-31 18:07 ` [PATCH v3] " Stian Halseth
2026-09-28 22:17 ` Stian Halseth [this message]
2026-10-07 5:56 ` Andreas Larsson
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=a1e1a8c88161894c8fcd4514900cf3a14232aa47.camel@itx.no \
--to=stian@itx.no \
--cc=andreas@gaisler.com \
--cc=davem@davemloft.net \
--cc=glaubitz@physik.fu-berlin.de \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@leemhuis.info \
--cc=regressions@lists.linux.dev \
--cc=sparclinux@vger.kernel.org \
--cc=tglx@kernel.org \
--cc=thomas.weissschuh@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=unixpro1970@gmail.com \
/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®