Message ID | 20231208133955.483851-1-nfraprado@collabora.com |
---|---|
State | Accepted |
Commit | 6154fb9c2134f8d9534b2de10491aa3a22f3c9ff |
Headers | show |
Series | kselftest: dt: Stop relying on dirname to improve performance | expand |
On Fri, Dec 08, 2023 at 10:39:27AM -0300, Nícolas F. R. A. Prado wrote: > When walking directory trees, instead of looking for specific files and > running dirname to get the parent folder, traverse all folders and > ignore the ones not containing the desired files. This avoids the need > to call dirname inside the loop, which gives a big performance boost, > approximately halving run time: Running locally on a > mt8192-asurada-spherion, which reports 160 test cases, has gone from > 5.5s to 2.9s, while running remotely with an nfsroot has gone from > 13.5s to 5.5s. It's hard to be sure exactly since the runtime is a bit variable but it does look like this is running substantially faster on the test systems I have that were most affected by the slowdown, looks like approximately a quarter of the time, and all the tests that were present before seem to still be present. Tested-by: Mark Brown <broonie@kernel.org>
diff --git a/tools/testing/selftests/dt/test_unprobed_devices.sh b/tools/testing/selftests/dt/test_unprobed_devices.sh index b07af2a4c4de..7fae90293a9d 100755 --- a/tools/testing/selftests/dt/test_unprobed_devices.sh +++ b/tools/testing/selftests/dt/test_unprobed_devices.sh @@ -33,8 +33,8 @@ if [[ ! -d "${PDT}" ]]; then fi nodes_compatible=$( - for node_compat in $(find ${PDT} -name compatible); do - node=$(dirname "${node_compat}") + for node in $(find ${PDT} -type d); do + [ ! -f "${node}"/compatible ] && continue # Check if node is available if [[ -e "${node}"/status ]]; then status=$(tr -d '\000' < "${node}"/status) @@ -46,10 +46,11 @@ nodes_compatible=$( nodes_dev_bound=$( IFS=$'\n' - for uevent in $(find /sys/devices -name uevent); do - if [[ -d "$(dirname "${uevent}")"/driver ]]; then - grep '^OF_FULLNAME=' "${uevent}" | sed -e 's|OF_FULLNAME=||' - fi + for dev_dir in $(find /sys/devices -type d); do + [ ! -f "${dev_dir}"/uevent ] && continue + [ ! -d "${dev_dir}"/driver ] && continue + + grep '^OF_FULLNAME=' "${dev_dir}"/uevent | sed -e 's|OF_FULLNAME=||' done )
When walking directory trees, instead of looking for specific files and running dirname to get the parent folder, traverse all folders and ignore the ones not containing the desired files. This avoids the need to call dirname inside the loop, which gives a big performance boost, approximately halving run time: Running locally on a mt8192-asurada-spherion, which reports 160 test cases, has gone from 5.5s to 2.9s, while running remotely with an nfsroot has gone from 13.5s to 5.5s. This change has a side-effect, which is that the root DT node now also shows in the output, even though it isn't expected to bind to a driver. However there shouldn't be a matching driver for the board compatible, so the end result will be just an extra skipped test: ok 1 / # SKIP Reported-by: Mark Brown <broonie@kernel.org> Closes: https://lore.kernel.org/all/310391e8-fdf2-4c2f-a680-7744eb685177@sirena.org.uk Fixes: 14571ab1ad21 ("kselftest: Add new test for detecting unprobed Devicetree devices") Signed-off-by: Nícolas F. R. A. Prado <nfraprado@collabora.com> --- tools/testing/selftests/dt/test_unprobed_devices.sh | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)