Commit 0674324b authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'linux-kselftest-next-5.10-rc1' of...

Merge tag 'linux-kselftest-next-5.10-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest

Pull kselftest updates from Shuah Khan:

 - speed up headers_install done during selftest build

 - add generic make nesting support

 - add support to select individual tests:

   Selftests build/install generates run_kselftest.sh script to run
   selftests on a target system. Currently the script doesn't have
   support for selecting individual tests. Add support for it.

   With this enhancement, user can select test collections (or tests)
   individually. e.g:

      run_kselftest.sh -c seccomp -t timers:posix_timers -t timers:nanosleep

   Additionally adds a way to list all known tests with "-l", usage with
   "-h", and perform a dry run without running tests with "-n".

* tag 'linux-kselftest-next-5.10-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest:
  doc: dev-tools: kselftest.rst: Update examples and paths
  selftests/run_kselftest.sh: Make each test individually selectable
  selftests: Extract run_kselftest.sh and generate stand-alone test list
  selftests: Add missing gitignore entries
  selftests: more general make nesting support
  selftests: use "$(MAKE)" instead of "make" for headers_install
parents bbf62599 4c851131
...@@ -125,32 +125,41 @@ Note that some tests will require root privileges. ...@@ -125,32 +125,41 @@ Note that some tests will require root privileges.
Install selftests Install selftests
================= =================
You can use the kselftest_install.sh tool to install selftests in the You can use the "install" target of "make" (which calls the `kselftest_install.sh`
default location, which is tools/testing/selftests/kselftest, or in a tool) to install selftests in the default location (`tools/testing/selftests/kselftest_install`),
user specified location. or in a user specified location via the `INSTALL_PATH` "make" variable.
To install selftests in default location:: To install selftests in default location::
$ cd tools/testing/selftests $ make -C tools/testing/selftests install
$ ./kselftest_install.sh
To install selftests in a user specified location:: To install selftests in a user specified location::
$ cd tools/testing/selftests $ make -C tools/testing/selftests install INSTALL_PATH=/some/other/path
$ ./kselftest_install.sh install_dir
Running installed selftests Running installed selftests
=========================== ===========================
Kselftest install as well as the Kselftest tarball provide a script Found in the install directory, as well as in the Kselftest tarball,
named "run_kselftest.sh" to run the tests. is a script named `run_kselftest.sh` to run the tests.
You can simply do the following to run the installed Kselftests. Please You can simply do the following to run the installed Kselftests. Please
note some tests will require root privileges:: note some tests will require root privileges::
$ cd kselftest $ cd kselftest_install
$ ./run_kselftest.sh $ ./run_kselftest.sh
To see the list of available tests, the `-l` option can be used::
$ ./run_kselftest.sh -l
The `-c` option can be used to run all the tests from a test collection, or
the `-t` option for specific single tests. Either can be used multiple times::
$ ./run_kselftest.sh -c bpf -c seccomp -t timers:posix_timers -t timer:nanosleep
For other features see the script usage output, seen with the `-h` option.
Packaging selftests Packaging selftests
=================== ===================
...@@ -160,9 +169,9 @@ different system. To package selftests, run:: ...@@ -160,9 +169,9 @@ different system. To package selftests, run::
$ make -C tools/testing/selftests gen_tar $ make -C tools/testing/selftests gen_tar
This generates a tarball in the `INSTALL_PATH/kselftest-packages` directory. By This generates a tarball in the `INSTALL_PATH/kselftest-packages` directory. By
default, `.gz` format is used. The tar format can be overridden by specifying default, `.gz` format is used. The tar compression format can be overridden by
a `FORMAT` make variable. Any value recognized by `tar's auto-compress`_ option specifying a `FORMAT` make variable. Any value recognized by `tar's auto-compress`_
is supported, such as:: option is supported, such as::
$ make -C tools/testing/selftests gen_tar FORMAT=.xz $ make -C tools/testing/selftests gen_tar FORMAT=.xz
......
...@@ -88,10 +88,10 @@ endif ...@@ -88,10 +88,10 @@ endif
# of the targets gets built. # of the targets gets built.
FORCE_TARGETS ?= FORCE_TARGETS ?=
# Clear LDFLAGS and MAKEFLAGS if called from main # Clear LDFLAGS and MAKEFLAGS when implicit rules are missing. This provides
# Makefile to avoid test build failures when test # implicit rules to sub-test Makefiles which avoids build failures in test
# Makefile doesn't have explicit build rules. # Makefile that don't have explicit build rules.
ifeq (1,$(MAKELEVEL)) ifeq (,$(LINK.c))
override LDFLAGS = override LDFLAGS =
override MAKEFLAGS = override MAKEFLAGS =
endif endif
...@@ -206,6 +206,7 @@ KSFT_INSTALL_PATH := $(abspath $(KSFT_INSTALL_PATH)) ...@@ -206,6 +206,7 @@ KSFT_INSTALL_PATH := $(abspath $(KSFT_INSTALL_PATH))
# Avoid changing the rest of the logic here and lib.mk. # Avoid changing the rest of the logic here and lib.mk.
INSTALL_PATH := $(KSFT_INSTALL_PATH) INSTALL_PATH := $(KSFT_INSTALL_PATH)
ALL_SCRIPT := $(INSTALL_PATH)/run_kselftest.sh ALL_SCRIPT := $(INSTALL_PATH)/run_kselftest.sh
TEST_LIST := $(INSTALL_PATH)/kselftest-list.txt
install: all install: all
ifdef INSTALL_PATH ifdef INSTALL_PATH
...@@ -214,6 +215,8 @@ ifdef INSTALL_PATH ...@@ -214,6 +215,8 @@ ifdef INSTALL_PATH
install -m 744 kselftest/module.sh $(INSTALL_PATH)/kselftest/ install -m 744 kselftest/module.sh $(INSTALL_PATH)/kselftest/
install -m 744 kselftest/runner.sh $(INSTALL_PATH)/kselftest/ install -m 744 kselftest/runner.sh $(INSTALL_PATH)/kselftest/
install -m 744 kselftest/prefix.pl $(INSTALL_PATH)/kselftest/ install -m 744 kselftest/prefix.pl $(INSTALL_PATH)/kselftest/
install -m 744 run_kselftest.sh $(INSTALL_PATH)/
rm -f $(TEST_LIST)
@ret=1; \ @ret=1; \
for TARGET in $(TARGETS); do \ for TARGET in $(TARGETS); do \
BUILD_TARGET=$$BUILD/$$TARGET; \ BUILD_TARGET=$$BUILD/$$TARGET; \
...@@ -222,33 +225,18 @@ ifdef INSTALL_PATH ...@@ -222,33 +225,18 @@ ifdef INSTALL_PATH
ret=$$((ret * $$?)); \ ret=$$((ret * $$?)); \
done; exit $$ret; done; exit $$ret;
@# Ask all targets to emit their test scripts
echo "#!/bin/sh" > $(ALL_SCRIPT)
echo "BASE_DIR=\$$(realpath \$$(dirname \$$0))" >> $(ALL_SCRIPT)
echo "cd \$$BASE_DIR" >> $(ALL_SCRIPT)
echo ". ./kselftest/runner.sh" >> $(ALL_SCRIPT)
echo "ROOT=\$$PWD" >> $(ALL_SCRIPT)
echo "if [ \"\$$1\" = \"--summary\" ]; then" >> $(ALL_SCRIPT)
echo " logfile=\$$BASE_DIR/output.log" >> $(ALL_SCRIPT)
echo " cat /dev/null > \$$logfile" >> $(ALL_SCRIPT)
echo "fi" >> $(ALL_SCRIPT)
@# While building run_kselftest.sh skip also non-existent TARGET dirs: @# Ask all targets to emit their test scripts
@# While building kselftest-list.text skip also non-existent TARGET dirs:
@# they could be the result of a build failure and should NOT be @# they could be the result of a build failure and should NOT be
@# included in the generated runlist. @# included in the generated runlist.
for TARGET in $(TARGETS); do \ for TARGET in $(TARGETS); do \
BUILD_TARGET=$$BUILD/$$TARGET; \ BUILD_TARGET=$$BUILD/$$TARGET; \
[ ! -d $(INSTALL_PATH)/$$TARGET ] && echo "Skipping non-existent dir: $$TARGET" && continue; \ [ ! -d $(INSTALL_PATH)/$$TARGET ] && echo "Skipping non-existent dir: $$TARGET" && continue; \
echo "[ -w /dev/kmsg ] && echo \"kselftest: Running tests in $$TARGET\" >> /dev/kmsg" >> $(ALL_SCRIPT); \
echo "cd $$TARGET" >> $(ALL_SCRIPT); \
echo -n "run_many" >> $(ALL_SCRIPT); \
echo -n "Emit Tests for $$TARGET\n"; \ echo -n "Emit Tests for $$TARGET\n"; \
$(MAKE) -s --no-print-directory OUTPUT=$$BUILD_TARGET -C $$TARGET emit_tests >> $(ALL_SCRIPT); \ $(MAKE) -s --no-print-directory OUTPUT=$$BUILD_TARGET COLLECTION=$$TARGET \
echo "" >> $(ALL_SCRIPT); \ -C $$TARGET emit_tests >> $(TEST_LIST); \
echo "cd \$$ROOT" >> $(ALL_SCRIPT); \
done; done;
chmod u+x $(ALL_SCRIPT)
else else
$(error Error: set INSTALL_PATH to use install) $(error Error: set INSTALL_PATH to use install)
endif endif
......
# SPDX-License-Identifier: GPL-2.0-only
fw_namespace
...@@ -47,9 +47,9 @@ ARCH ?= $(SUBARCH) ...@@ -47,9 +47,9 @@ ARCH ?= $(SUBARCH)
khdr: khdr:
ifndef KSFT_KHDR_INSTALL_DONE ifndef KSFT_KHDR_INSTALL_DONE
ifeq (1,$(DEFAULT_INSTALL_HDR_PATH)) ifeq (1,$(DEFAULT_INSTALL_HDR_PATH))
make --no-builtin-rules ARCH=$(ARCH) -C $(top_srcdir) headers_install $(MAKE) --no-builtin-rules ARCH=$(ARCH) -C $(top_srcdir) headers_install
else else
make --no-builtin-rules INSTALL_HDR_PATH=$$OUTPUT/usr \ $(MAKE) --no-builtin-rules INSTALL_HDR_PATH=$$OUTPUT/usr \
ARCH=$(ARCH) -C $(top_srcdir) headers_install ARCH=$(ARCH) -C $(top_srcdir) headers_install
endif endif
endif endif
...@@ -107,9 +107,8 @@ endif ...@@ -107,9 +107,8 @@ endif
emit_tests: emit_tests:
for TEST in $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_PROGS); do \ for TEST in $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_PROGS); do \
BASENAME_TEST=`basename $$TEST`; \ BASENAME_TEST=`basename $$TEST`; \
echo " \\"; \ echo "$(COLLECTION):$$BASENAME_TEST"; \
echo -n " \"$$BASENAME_TEST\""; \ done
done; \
# define if isn't already. It is undefined in make O= case. # define if isn't already. It is undefined in make O= case.
ifeq ($(RM),) ifeq ($(RM),)
......
# SPDX-License-Identifier: GPL-2.0-only
nf-queue
# SPDX-License-Identifier: GPL-2.0-only # SPDX-License-Identifier: GPL-2.0-only
get_syscall_info get_syscall_info
peeksiginfo peeksiginfo
vmaccess
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0
#
# Run installed kselftest tests.
#
BASE_DIR=$(realpath $(dirname $0))
cd $BASE_DIR
TESTS="$BASE_DIR"/kselftest-list.txt
if [ ! -r "$TESTS" ] ; then
echo "$0: Could not find list of tests to run ($TESTS)" >&2
available=""
else
available="$(cat "$TESTS")"
fi
. ./kselftest/runner.sh
ROOT=$PWD
usage()
{
cat <<EOF
Usage: $0 [OPTIONS]
-s | --summary Print summary with detailed log in output.log
-t | --test COLLECTION:TEST Run TEST from COLLECTION
-c | --collection COLLECTION Run all tests from COLLECTION
-l | --list List the available collection:test entries
-d | --dry-run Don't actually run any tests
-h | --help Show this usage info
EOF
exit $1
}
COLLECTIONS=""
TESTS=""
dryrun=""
while true; do
case "$1" in
-s | --summary)
logfile="$BASE_DIR"/output.log
cat /dev/null > $logfile
shift ;;
-t | --test)
TESTS="$TESTS $2"
shift 2 ;;
-c | --collection)
COLLECTIONS="$COLLECTIONS $2"
shift 2 ;;
-l | --list)
echo "$available"
exit 0 ;;
-n | --dry-run)
dryrun="echo"
shift ;;
-h | --help)
usage 0 ;;
"")
break ;;
*)
usage 1 ;;
esac
done
# Add all selected collections to the explicit test list.
if [ -n "$COLLECTIONS" ]; then
for collection in $COLLECTIONS ; do
found="$(echo "$available" | grep "^$collection:")"
if [ -z "$found" ] ; then
echo "No such collection '$collection'" >&2
exit 1
fi
TESTS="$TESTS $found"
done
fi
# Replace available test list with explicitly selected tests.
if [ -n "$TESTS" ]; then
valid=""
for test in $TESTS ; do
found="$(echo "$available" | grep "^${test}$")"
if [ -z "$found" ] ; then
echo "No such test '$test'" >&2
exit 1
fi
valid="$valid $found"
done
available="$(echo "$valid" | sed -e 's/ /\n/g')"
fi
collections=$(echo "$available" | cut -d: -f1 | uniq)
for collection in $collections ; do
[ -w /dev/kmsg ] && echo "kselftest: Running tests in $collection" >> /dev/kmsg
tests=$(echo "$available" | grep "^$collection:" | cut -d: -f2)
($dryrun cd "$collection" && $dryrun run_many $tests)
done
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment