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.o...@gmail.com>
Cc: Markus Stockhausen <markus.stockhau...@gmx.de>
Signed-off-by: Sander Vanheule <san...@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
}
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel