All of lore.kernel.org
 help / color / mirror / Atom feed
* 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.