mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 15:14:43 +00:00
powerpc: Fix flush_cache() speed regression
Flushing kernel image after decompression was taking 113 milliseconds with U-boot 2022.10. With U-boot 2023.01 and 2023.04, flushing the same amount of memory takes approx 1.5 seconds. With U-boot 2023.07-rc6, it takes 6.5 seconds. powerpc flush_cache() function used to call WATCHDOG_RESET() after flushing every cacheline. At that time WATCHDOG_RESET() was light so the operation was almost seamless. But commit29caf9305b
("cyclic: Use schedule() instead of WATCHDOG_RESET()") replaced WATCHDOG_RESET() by schedule() and that started to hurt with U-boot 2022.10. And in U-boot 2023.07-rc6 that's even worse after commit26e8ebcd7c
("watchdog: mpc8xxx: Make it generic"). In the meantime commit729c1fe656
("powerpc: introduce CONFIG_CACHE_FLUSH_WATCHDOG_THRESHOLD") gives us the opportinity to only call schedule() every given chunk of data instead of every cacheline. As explained in that commit there is no point in pinging the watchdog after every cacheline flush, so lets define a sensible default chunk size of 4k which matches to size of a page on most powerpc platforms. With that new default threshold, the culprit flushing performed after kernel image decompression now takes 85 milliseconds on a powerpc 8xx. Fixes:29caf9305b
("cyclic: Use schedule() instead of WATCHDOG_RESET()") Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
This commit is contained in:
parent
ad47974707
commit
64948e247e
1 changed files with 5 additions and 5 deletions
|
@ -1,9 +1,9 @@
|
|||
config CACHE_FLUSH_WATCHDOG_THRESHOLD
|
||||
int "Bytes to flush between WATCHDOG_RESET calls"
|
||||
default 0
|
||||
int "Bytes to flush between schedule() calls"
|
||||
default 4096
|
||||
help
|
||||
The flush_cache() function periodically, and by default for
|
||||
every cache line, calls WATCHDOG_RESET(). When flushing a
|
||||
large area, that may add a significant amount of
|
||||
every 4k block, calls schedule() to reset watchdog. When
|
||||
flushing a large area, that may add a significant amount of
|
||||
overhead. This option allows you to set a threshold for how
|
||||
many bytes to flush between each WATCHDOG_RESET call.
|
||||
many bytes to flush between each schedule() call.
|
||||
|
|
Loading…
Reference in a new issue