mirror of
https://github.com/torvalds/linux.git
synced 2026-04-22 00:33:58 -04:00
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: 14571ab1ad ("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>
85 lines
1.9 KiB
Bash
Executable File
85 lines
1.9 KiB
Bash
Executable File
#!/bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
#
|
|
# Copyright (c) 2023 Collabora Ltd
|
|
#
|
|
# Based on Frank Rowand's dt_stat script.
|
|
#
|
|
# This script tests for devices that were declared on the Devicetree and are
|
|
# expected to bind to a driver, but didn't.
|
|
#
|
|
# To achieve this, two lists are used:
|
|
# * a list of the compatibles that can be matched by a Devicetree node
|
|
# * a list of compatibles that should be ignored
|
|
#
|
|
|
|
DIR="$(dirname $(readlink -f "$0"))"
|
|
|
|
source "${DIR}"/ktap_helpers.sh
|
|
|
|
PDT=/proc/device-tree/
|
|
COMPAT_LIST="${DIR}"/compatible_list
|
|
IGNORE_LIST="${DIR}"/compatible_ignore_list
|
|
|
|
KSFT_PASS=0
|
|
KSFT_FAIL=1
|
|
KSFT_SKIP=4
|
|
|
|
ktap_print_header
|
|
|
|
if [[ ! -d "${PDT}" ]]; then
|
|
ktap_skip_all "${PDT} doesn't exist."
|
|
exit "${KSFT_SKIP}"
|
|
fi
|
|
|
|
nodes_compatible=$(
|
|
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)
|
|
[[ "${status}" != "okay" && "${status}" != "ok" ]] && continue
|
|
fi
|
|
echo "${node}" | sed -e 's|\/proc\/device-tree||'
|
|
done | sort
|
|
)
|
|
|
|
nodes_dev_bound=$(
|
|
IFS=$'\n'
|
|
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
|
|
)
|
|
|
|
num_tests=$(echo ${nodes_compatible} | wc -w)
|
|
ktap_set_plan "${num_tests}"
|
|
|
|
retval="${KSFT_PASS}"
|
|
for node in ${nodes_compatible}; do
|
|
if ! echo "${nodes_dev_bound}" | grep -E -q "(^| )${node}( |\$)"; then
|
|
compatibles=$(tr '\000' '\n' < "${PDT}"/"${node}"/compatible)
|
|
|
|
for compatible in ${compatibles}; do
|
|
if grep -x -q "${compatible}" "${IGNORE_LIST}"; then
|
|
continue
|
|
fi
|
|
|
|
if grep -x -q "${compatible}" "${COMPAT_LIST}"; then
|
|
ktap_test_fail "${node}"
|
|
retval="${KSFT_FAIL}"
|
|
continue 2
|
|
fi
|
|
done
|
|
ktap_test_skip "${node}"
|
|
else
|
|
ktap_test_pass "${node}"
|
|
fi
|
|
|
|
done
|
|
|
|
ktap_print_totals
|
|
exit "${retval}"
|