Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

kselftest: dt: Stop relying on dirname to improve performance

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 drastically decreases 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")
Tested-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Nícolas F. R. A. Prado <nfraprado@collabora.com>
Link: https://lore.kernel.org/r/20240122-dt-kselftest-dirname-perf-fix-v2-1-f1630532fd38@collabora.com
Signed-off-by: Rob Herring <robh@kernel.org>

authored by

Nícolas F. R. A. Prado and committed by
Rob Herring
6154fb9c 93502421

+7 -6
+7 -6
tools/testing/selftests/dt/test_unprobed_devices.sh
··· 33 33 fi 34 34 35 35 nodes_compatible=$( 36 - for node_compat in $(find ${PDT} -name compatible); do 37 - node=$(dirname "${node_compat}") 36 + for node in $(find ${PDT} -type d); do 37 + [ ! -f "${node}"/compatible ] && continue 38 38 # Check if node is available 39 39 if [[ -e "${node}"/status ]]; then 40 40 status=$(tr -d '\000' < "${node}"/status) ··· 46 46 47 47 nodes_dev_bound=$( 48 48 IFS=$'\n' 49 - for uevent in $(find /sys/devices -name uevent); do 50 - if [[ -d "$(dirname "${uevent}")"/driver ]]; then 51 - grep '^OF_FULLNAME=' "${uevent}" | sed -e 's|OF_FULLNAME=||' 52 - fi 49 + for dev_dir in $(find /sys/devices -type d); do 50 + [ ! -f "${dev_dir}"/uevent ] && continue 51 + [ ! -d "${dev_dir}"/driver ] && continue 52 + 53 + grep '^OF_FULLNAME=' "${dev_dir}"/uevent | sed -e 's|OF_FULLNAME=||' 53 54 done 54 55 ) 55 56