* Re: Patch "clocksource/drivers/timer-rtl-otto: Work around dying timers" has been added to the 6.17-stab
[not found] <20251104131736.99355-1-sashal () kernel ! org>
@ 2025-11-08 19:32 ` Pascal Ernster
2025-11-09 13:53 ` Sasha Levin
0 siblings, 1 reply; 3+ messages in thread
From: Pascal Ernster @ 2025-11-08 19:32 UTC (permalink / raw)
To: Sasha Levin, stable; +Cc: Markus Stockhausen, Greg Kroah-Hartman
Hi Sasha,
[2025-11-04 14:17] Sasha Levin:
> This is a note to let you know that I've just added the patch titled
>
> clocksource/drivers/timer-rtl-otto: Work around dying timers
>
> to the 6.17-stable tree which can be found at:
> http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
>
> The filename of the patch is:
> clocksource-drivers-timer-rtl-otto-work-around-dying.patch
> and it can be found in the queue-6.17 subdirectory.
>
> If you, or anyone else, feels it should not be added to the stable tree,
> please let <stable@vger.kernel.org> know about it.
>
>
>
> commit fbc0494f847969d81c1f087117dca462c816bedb
> Author: Markus Stockhausen <markus.stockhausen@gmx.de>
> Date: Mon Aug 4 04:03:25 2025 -0400
>
> clocksource/drivers/timer-rtl-otto: Work around dying timers
>
> [ Upstream commit e7a25106335041aeca4fdf50a84804c90142c886 ]
>
> The OpenWrt distribution has switched from kernel longterm 6.6 to
> 6.12. Reports show that devices with the Realtek Otto switch platform
> die during operation and are rebooted by the watchdog. Sorting out
> other possible reasons the Otto timer is to blame. The platform
> currently consists of 4 targets with different hardware revisions.
> It is not 100% clear which devices and revisions are affected.
>
> Analysis shows:
>
> A more aggressive sched/deadline handling leads to more timer starts
> with small intervals. This increases the bug chances. See
> https://marc.info/?l=linux-kernel&m=175276556023276&w=2
>
> Focusing on the real issue a hardware limitation on some devices was
> found. There is a minimal chance that a timer ends without firing an
> interrupt if it is reprogrammed within the 5us before its expiration
> time. Work around this issue by introducing a bounce() function. It
> restarts the timer directly before the normal restart functions as
> follows:
>
> - Stop timer
> - Restart timer with a slow frequency.
> - Target time will be >5us
> - The subsequent normal restart is outside the critical window
>
> Downstream has already tested and confirmed a patch. See
> https://github.com/openwrt/openwrt/pull/19468
> https://forum.openwrt.org/t/support-for-rtl838x-based-managed-switches/57875/3788
>
> Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
> Tested-by: Stephen Howell <howels@allthatwemight.be>
> Tested-by: Bjørn Mork <bjorn@mork.no>
> Link: https://lore.kernel.org/r/20250804080328.2609287-2-markus.stockhausen@gmx.de
> Signed-off-by: Sasha Levin <sashal@kernel.org>
>
> diff --git a/drivers/clocksource/timer-rtl-otto.c b/drivers/clocksource/timer-rtl-otto.c
> index 8a3068b36e752..8be45a11fb8b6 100644
> --- a/drivers/clocksource/timer-rtl-otto.c
> +++ b/drivers/clocksource/timer-rtl-otto.c
> @@ -38,6 +38,7 @@
> #define RTTM_BIT_COUNT 28
> #define RTTM_MIN_DELTA 8
> #define RTTM_MAX_DELTA CLOCKSOURCE_MASK(28)
> +#define RTTM_MAX_DIVISOR GENMASK(15, 0)
>
> /*
> * Timers are derived from the LXB clock frequency. Usually this is a fixed
> @@ -112,6 +113,22 @@ static irqreturn_t rttm_timer_interrupt(int irq, void *dev_id)
> return IRQ_HANDLED;
> }
>
> +static void rttm_bounce_timer(void __iomem *base, u32 mode)
> +{
> + /*
> + * When a running timer has less than ~5us left, a stop/start sequence
> + * might fail. While the details are unknown the most evident effect is
> + * that the subsequent interrupt will not be fired.
> + *
> + * As a workaround issue an intermediate restart with a very slow
> + * frequency of ~3kHz keeping the target counter (>=8). So the follow
> + * up restart will always be issued outside the critical window.
> + */
> +
> + rttm_disable_timer(base);
> + rttm_enable_timer(base, mode, RTTM_MAX_DIVISOR);
> +}
> +
> static void rttm_stop_timer(void __iomem *base)
> {
> rttm_disable_timer(base);
> @@ -129,6 +146,7 @@ static int rttm_next_event(unsigned long delta, struct clock_event_device *clkev
> struct timer_of *to = to_timer_of(clkevt);
>
> RTTM_DEBUG(to->of_base.base);
> + rttm_bounce_timer(to->of_base.base, RTTM_CTRL_COUNTER);
> rttm_stop_timer(to->of_base.base);
> rttm_set_period(to->of_base.base, delta);
> rttm_start_timer(to, RTTM_CTRL_COUNTER);
> @@ -141,6 +159,7 @@ static int rttm_state_oneshot(struct clock_event_device *clkevt)
> struct timer_of *to = to_timer_of(clkevt);
>
> RTTM_DEBUG(to->of_base.base);
> + rttm_bounce_timer(to->of_base.base, RTTM_CTRL_COUNTER);
> rttm_stop_timer(to->of_base.base);
> rttm_set_period(to->of_base.base, RTTM_TICKS_PER_SEC / HZ);
> rttm_start_timer(to, RTTM_CTRL_COUNTER);
> @@ -153,6 +172,7 @@ static int rttm_state_periodic(struct clock_event_device *clkevt)
> struct timer_of *to = to_timer_of(clkevt);
>
> RTTM_DEBUG(to->of_base.base);
> + rttm_bounce_timer(to->of_base.base, RTTM_CTRL_TIMER);
> rttm_stop_timer(to->of_base.base);
> rttm_set_period(to->of_base.base, RTTM_TICKS_PER_SEC / HZ);
> rttm_start_timer(to, RTTM_CTRL_TIMER);
this patch is part of a series of 4 patches, but it seems you have only cherry-picked patches 1 and 3 from that series, although all 4 were merged into Linus' tree:
https://lore.kernel.org/all/20250804080328.2609287-1-markus.stockhausen@gmx.de/
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/drivers/clocksource/timer-rtl-otto.c?h=v6.18-rc4
I could only find the "linux-stable-commits" mails for queue-6.17, but you selected the same 2 patches for queue-6.12 as well. Is that selection of only 2 of the 4 patches intentional?
Regards
Pascaö
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: Patch "clocksource/drivers/timer-rtl-otto: Work around dying timers" has been added to the 6.17-stab
2025-11-08 19:32 ` Patch "clocksource/drivers/timer-rtl-otto: Work around dying timers" has been added to the 6.17-stab Pascal Ernster
@ 2025-11-09 13:53 ` Sasha Levin
2025-11-09 14:19 ` Pascal Ernster
0 siblings, 1 reply; 3+ messages in thread
From: Sasha Levin @ 2025-11-09 13:53 UTC (permalink / raw)
To: Pascal Ernster; +Cc: stable, Markus Stockhausen, Greg Kroah-Hartman
On Sat, Nov 08, 2025 at 08:32:37PM +0100, Pascal Ernster wrote:
>Hi Sasha,
>
>
>[2025-11-04 14:17] Sasha Levin:
>> This is a note to let you know that I've just added the patch titled
>>
>> clocksource/drivers/timer-rtl-otto: Work around dying timers
>>
>> to the 6.17-stable tree which can be found at:
>> http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
>>
>> The filename of the patch is:
>> clocksource-drivers-timer-rtl-otto-work-around-dying.patch
>> and it can be found in the queue-6.17 subdirectory.
>>
>> If you, or anyone else, feels it should not be added to the stable tree,
>> please let <stable@vger.kernel.org> know about it.
>>
>>
>>
>> commit fbc0494f847969d81c1f087117dca462c816bedb
>> Author: Markus Stockhausen <markus.stockhausen@gmx.de>
>> Date: Mon Aug 4 04:03:25 2025 -0400
>>
>> clocksource/drivers/timer-rtl-otto: Work around dying timers
>>
>> [ Upstream commit e7a25106335041aeca4fdf50a84804c90142c886 ]
>>
>> The OpenWrt distribution has switched from kernel longterm 6.6 to
>> 6.12. Reports show that devices with the Realtek Otto switch platform
>> die during operation and are rebooted by the watchdog. Sorting out
>> other possible reasons the Otto timer is to blame. The platform
>> currently consists of 4 targets with different hardware revisions.
>> It is not 100% clear which devices and revisions are affected.
>>
>> Analysis shows:
>>
>> A more aggressive sched/deadline handling leads to more timer starts
>> with small intervals. This increases the bug chances. See
>> https://marc.info/?l=linux-kernel&m=175276556023276&w=2
>>
>> Focusing on the real issue a hardware limitation on some devices was
>> found. There is a minimal chance that a timer ends without firing an
>> interrupt if it is reprogrammed within the 5us before its expiration
>> time. Work around this issue by introducing a bounce() function. It
>> restarts the timer directly before the normal restart functions as
>> follows:
>>
>> - Stop timer
>> - Restart timer with a slow frequency.
>> - Target time will be >5us
>> - The subsequent normal restart is outside the critical window
>>
>> Downstream has already tested and confirmed a patch. See
>> https://github.com/openwrt/openwrt/pull/19468
>> https://forum.openwrt.org/t/support-for-rtl838x-based-managed-switches/57875/3788
>>
>> Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
>> Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org>
>> Tested-by: Stephen Howell <howels@allthatwemight.be>
>> Tested-by: Bjørn Mork <bjorn@mork.no>
>> Link: https://lore.kernel.org/r/20250804080328.2609287-2-markus.stockhausen@gmx.de
>> Signed-off-by: Sasha Levin <sashal@kernel.org>
>>
>> diff --git a/drivers/clocksource/timer-rtl-otto.c b/drivers/clocksource/timer-rtl-otto.c
>> index 8a3068b36e752..8be45a11fb8b6 100644
>> --- a/drivers/clocksource/timer-rtl-otto.c
>> +++ b/drivers/clocksource/timer-rtl-otto.c
>> @@ -38,6 +38,7 @@
>> #define RTTM_BIT_COUNT 28
>> #define RTTM_MIN_DELTA 8
>> #define RTTM_MAX_DELTA CLOCKSOURCE_MASK(28)
>> +#define RTTM_MAX_DIVISOR GENMASK(15, 0)
>>
>> /*
>> * Timers are derived from the LXB clock frequency. Usually this is a fixed
>> @@ -112,6 +113,22 @@ static irqreturn_t rttm_timer_interrupt(int irq, void *dev_id)
>> return IRQ_HANDLED;
>> }
>>
>> +static void rttm_bounce_timer(void __iomem *base, u32 mode)
>> +{
>> + /*
>> + * When a running timer has less than ~5us left, a stop/start sequence
>> + * might fail. While the details are unknown the most evident effect is
>> + * that the subsequent interrupt will not be fired.
>> + *
>> + * As a workaround issue an intermediate restart with a very slow
>> + * frequency of ~3kHz keeping the target counter (>=8). So the follow
>> + * up restart will always be issued outside the critical window.
>> + */
>> +
>> + rttm_disable_timer(base);
>> + rttm_enable_timer(base, mode, RTTM_MAX_DIVISOR);
>> +}
>> +
>> static void rttm_stop_timer(void __iomem *base)
>> {
>> rttm_disable_timer(base);
>> @@ -129,6 +146,7 @@ static int rttm_next_event(unsigned long delta, struct clock_event_device *clkev
>> struct timer_of *to = to_timer_of(clkevt);
>>
>> RTTM_DEBUG(to->of_base.base);
>> + rttm_bounce_timer(to->of_base.base, RTTM_CTRL_COUNTER);
>> rttm_stop_timer(to->of_base.base);
>> rttm_set_period(to->of_base.base, delta);
>> rttm_start_timer(to, RTTM_CTRL_COUNTER);
>> @@ -141,6 +159,7 @@ static int rttm_state_oneshot(struct clock_event_device *clkevt)
>> struct timer_of *to = to_timer_of(clkevt);
>>
>> RTTM_DEBUG(to->of_base.base);
>> + rttm_bounce_timer(to->of_base.base, RTTM_CTRL_COUNTER);
>> rttm_stop_timer(to->of_base.base);
>> rttm_set_period(to->of_base.base, RTTM_TICKS_PER_SEC / HZ);
>> rttm_start_timer(to, RTTM_CTRL_COUNTER);
>> @@ -153,6 +172,7 @@ static int rttm_state_periodic(struct clock_event_device *clkevt)
>> struct timer_of *to = to_timer_of(clkevt);
>>
>> RTTM_DEBUG(to->of_base.base);
>> + rttm_bounce_timer(to->of_base.base, RTTM_CTRL_TIMER);
>> rttm_stop_timer(to->of_base.base);
>> rttm_set_period(to->of_base.base, RTTM_TICKS_PER_SEC / HZ);
>> rttm_start_timer(to, RTTM_CTRL_TIMER);
>
>
>this patch is part of a series of 4 patches, but it seems you have only cherry-picked patches 1 and 3 from that series, although all 4 were merged into Linus' tree:
>
>https://lore.kernel.org/all/20250804080328.2609287-1-markus.stockhausen@gmx.de/
>
>https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/log/drivers/clocksource/timer-rtl-otto.c?h=v6.18-rc4
>
>
>I could only find the "linux-stable-commits" mails for queue-6.17, but you selected the same 2 patches for queue-6.12 as well. Is that selection of only 2 of the 4 patches intentional?
Do we actually need the other two patches? They don't look like fixes.
--
Thanks,
Sasha
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: Patch "clocksource/drivers/timer-rtl-otto: Work around dying timers" has been added to the 6.17-stab
2025-11-09 13:53 ` Sasha Levin
@ 2025-11-09 14:19 ` Pascal Ernster
0 siblings, 0 replies; 3+ messages in thread
From: Pascal Ernster @ 2025-11-09 14:19 UTC (permalink / raw)
To: Sasha Levin; +Cc: stable, Markus Stockhausen, Greg Kroah-Hartman
[2025-11-09 14:53] Sasha Levin:
> Do we actually need the other two patches? They don't look like fixes.
Oh, my bad, you're correct. Sorry for the noise.
Regards
Pascal
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2025-11-09 14:19 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20251104131736.99355-1-sashal () kernel ! org>
2025-11-08 19:32 ` Patch "clocksource/drivers/timer-rtl-otto: Work around dying timers" has been added to the 6.17-stab Pascal Ernster
2025-11-09 13:53 ` Sasha Levin
2025-11-09 14:19 ` Pascal Ernster
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.