[PATCH] realtek: mark clock source as continuous
Jan Hoffmann
jan at 3e8.eu
Mon Oct 31 13:21:25 PDT 2022
On 31.10.22 at 10:11, Sander Vanheule wrote:
> After replacing the R4K event timer and clock source with the new
> Realtek Otto timer, performance for RTL839x devices was severely
> impacted, as reported by Hiroshi.
>
> Research by Markus showed that after commit 4657a5301eb5 (realtek: avoid
> busy waiting for RTL839x PHY read/write, 2022-10-14), the ethernet
> driver could only update a phy once per timer interval, which also
> heavily impacted boot time. On e.g. a Zyxel GS1900-48, this added around
> a minute to the time to fully initialise the switch.
>
> By marking the otto clocksource as continuous, the kernel enables it to
> be used for high resolution timers. This allows readx_poll_timeout() to
> sleep for less than one system timer interval, reducing system dead
> time.
I can confirm this brings usleep_range sleep duration back to a more
reasonable amount of time.
Average time for usleep_range(10, 20); when called in a loop 10000 times
(tested on HPE 1920-8G for RTL838x and 1920-48G for RTL839x):
RTL838x RTL839x
r4k timer 48 us 31 us
otto timer 10003 us 10031 us
otto timer with patch 60 us 32 us
Average runtime of the polling loop in smi_wait_op is now also back to
where it was with the r4k timer (under 0.3 ms for RTL838x and under 0.5
ms for RTL839x on otherwise idle device, compared to 5 ms / 10 ms when
using the otto timer without the patch).
> Link: https://github.com/openwrt/openwrt/issues/11117
> Reported-by: INAGAKI Hiroshi <musashino.open at gmail.com>
> Cc: Markus Stockhausen <markus.stockhausen at gmx.de>
> Signed-off-by: Sander Vanheule <sander at svanheule.net>
> ---
> With this patch, initialisation time for my GS1900-48 drops from 110
> seconds to 50 seconds. Please check if you can reproduce this. The 'why
> this works' from the commit message is from a quick look at the places
> where this CLOCK_SOURCE flag is checked, so I hope it actually makes sense.
>
> Best,
> Sander
>
> .../realtek/files-5.10/drivers/clocksource/timer-rtl-otto.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/target/linux/realtek/files-5.10/drivers/clocksource/timer-rtl-otto.c b/target/linux/realtek/files-5.10/drivers/clocksource/timer-rtl-otto.c
> index 12eed78653d0..14e28e50f40e 100644
> --- a/target/linux/realtek/files-5.10/drivers/clocksource/timer-rtl-otto.c
> +++ b/target/linux/realtek/files-5.10/drivers/clocksource/timer-rtl-otto.c
> @@ -227,6 +227,7 @@ struct rttm_cs rttm_cs = {
> .name = "realtek_otto_timer",
> .rating = 400,
> .mask = CLOCKSOURCE_MASK(RTTM_BIT_COUNT),
> + .flags = CLOCK_SOURCE_IS_CONTINUOUS,
> .read = rttm_read_clocksource,
> .enable = rttm_enable_clocksource
> }
More information about the openwrt-devel
mailing list