Skip to content
Snippets Groups Projects
Commit 75ec0ba2 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'linux-kselftest-5.7-rc4' of...

Merge tag 'linux-kselftest-5.7-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest

Pull kselftest updates from Shuah Khan:

 - ftrace test fixes to check for required filter files and kprobe args.

 - Kselftest build/cross-build dependency check script to make it easier
   for test ring admins/users to configure build systems correctly for
   build/cross-build kselftests. Currently checks library dependencies.

    - Checks if Kselftests can be built/cross-built on a system running
      compile test on a trivial C file with LDLIBS specified for each
      individual test in their Makefiles.

    - Prints suggested target list for a system filtering out tests
      failed the build dependency check from the TARGETS in Selftests
      the main Makefile when optional -p is specified.

    - Prints pass/fail dependency check for each tests/sub-test.

    - Prints pass/fail targets and libraries.

    - Default: runs dependency checks on all tests.

    - Optional test name can be specified to check dependencies for it.

* tag 'linux-kselftest-5.7-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest:
  selftests/ftrace: Check the first record for kprobe_args_type.tc
  selftests: add build/cross-build dependency check script
  selftests/ftrace: Check required filter files before running test
parents af4a32ad f0c0d0cf
No related branches found
No related tags found
No related merge requests found
Showing
with 315 additions and 40 deletions
...@@ -10,10 +10,7 @@ if ! grep -q function_graph available_tracers; then ...@@ -10,10 +10,7 @@ if ! grep -q function_graph available_tracers; then
exit_unsupported exit_unsupported
fi fi
if [ ! -f set_ftrace_filter ]; then check_filter_file set_ftrace_filter
echo "set_ftrace_filter not found? Is dynamic ftrace not set?"
exit_unsupported
fi
do_reset() { do_reset() {
if [ -e /proc/sys/kernel/stack_tracer_enabled ]; then if [ -e /proc/sys/kernel/stack_tracer_enabled ]; then
......
...@@ -9,6 +9,8 @@ if ! grep -q function_graph available_tracers; then ...@@ -9,6 +9,8 @@ if ! grep -q function_graph available_tracers; then
exit_unsupported exit_unsupported
fi fi
check_filter_file set_ftrace_filter
fail() { # msg fail() { # msg
echo $1 echo $1
exit_fail exit_fail
......
...@@ -9,6 +9,8 @@ if ! grep -q function available_tracers; then ...@@ -9,6 +9,8 @@ if ! grep -q function available_tracers; then
exit_unsupported exit_unsupported
fi fi
check_filter_file set_ftrace_filter
disable_tracing disable_tracing
clear_trace clear_trace
......
...@@ -15,10 +15,7 @@ if [ ! -f set_ftrace_notrace_pid ]; then ...@@ -15,10 +15,7 @@ if [ ! -f set_ftrace_notrace_pid ]; then
exit_unsupported exit_unsupported
fi fi
if [ ! -f set_ftrace_filter ]; then check_filter_file set_ftrace_filter
echo "set_ftrace_filter not found? Is function tracer not set?"
exit_unsupported
fi
do_function_fork=1 do_function_fork=1
......
...@@ -16,10 +16,7 @@ if [ ! -f set_ftrace_pid ]; then ...@@ -16,10 +16,7 @@ if [ ! -f set_ftrace_pid ]; then
exit_unsupported exit_unsupported
fi fi
if [ ! -f set_ftrace_filter ]; then check_filter_file set_ftrace_filter
echo "set_ftrace_filter not found? Is function tracer not set?"
exit_unsupported
fi
do_function_fork=1 do_function_fork=1
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
# description: ftrace - stacktrace filter command # description: ftrace - stacktrace filter command
# flags: instance # flags: instance
[ ! -f set_ftrace_filter ] && exit_unsupported check_filter_file set_ftrace_filter
echo _do_fork:stacktrace >> set_ftrace_filter echo _do_fork:stacktrace >> set_ftrace_filter
......
...@@ -11,10 +11,7 @@ ...@@ -11,10 +11,7 @@
# #
# The triggers are set within the set_ftrace_filter file # The triggers are set within the set_ftrace_filter file
if [ ! -f set_ftrace_filter ]; then check_filter_file set_ftrace_filter
echo "set_ftrace_filter not found? Is dynamic ftrace not set?"
exit_unsupported
fi
do_reset() { do_reset() {
reset_ftrace_filter reset_ftrace_filter
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
# description: ftrace - function trace on module # description: ftrace - function trace on module
[ ! -f set_ftrace_filter ] && exit_unsupported check_filter_file set_ftrace_filter
: "mod: allows to filter a non exist function" : "mod: allows to filter a non exist function"
echo 'non_exist_func:mod:non_exist_module' > set_ftrace_filter echo 'non_exist_func:mod:non_exist_module' > set_ftrace_filter
......
...@@ -18,10 +18,7 @@ if ! grep -q function_graph available_tracers; then ...@@ -18,10 +18,7 @@ if ! grep -q function_graph available_tracers; then
exit_unsupported; exit_unsupported;
fi fi
if [ ! -f set_ftrace_filter ]; then check_filter_file set_ftrace_filter
echo "set_ftrace_filter not found? Is dynamic ftrace not set?"
exit_unsupported
fi
if [ ! -f function_profile_enabled ]; then if [ ! -f function_profile_enabled ]; then
echo "function_profile_enabled not found, function profiling enabled?" echo "function_profile_enabled not found, function profiling enabled?"
......
...@@ -10,10 +10,7 @@ ...@@ -10,10 +10,7 @@
# #
# The triggers are set within the set_ftrace_filter file # The triggers are set within the set_ftrace_filter file
if [ ! -f set_ftrace_filter ]; then check_filter_file set_ftrace_filter
echo "set_ftrace_filter not found? Is dynamic ftrace not set?"
exit_unsupported
fi
fail() { # mesg fail() { # mesg
echo $1 echo $1
......
...@@ -8,6 +8,8 @@ if [ ! -f stack_trace ]; then ...@@ -8,6 +8,8 @@ if [ ! -f stack_trace ]; then
exit_unsupported exit_unsupported
fi fi
check_filter_file stack_trace_filter
echo > stack_trace_filter echo > stack_trace_filter
echo 0 > stack_max_size echo 0 > stack_max_size
echo 1 > /proc/sys/kernel/stack_tracer_enabled echo 1 > /proc/sys/kernel/stack_tracer_enabled
......
...@@ -11,10 +11,7 @@ ...@@ -11,10 +11,7 @@
# #
# The triggers are set within the set_ftrace_filter file # The triggers are set within the set_ftrace_filter file
if [ ! -f set_ftrace_filter ]; then check_filter_file set_ftrace_filter
echo "set_ftrace_filter not found? Is dynamic ftrace not set?"
exit_unsupported
fi
fail() { # mesg fail() { # mesg
echo $1 echo $1
......
check_filter_file() { # check filter file introduced by dynamic ftrace
if [ ! -f "$1" ]; then
echo "$1 not found? Is dynamic ftrace not set?"
exit_unsupported
fi
}
clear_trace() { # reset trace output clear_trace() { # reset trace output
echo > trace echo > trace
......
...@@ -38,7 +38,7 @@ for width in 64 32 16 8; do ...@@ -38,7 +38,7 @@ for width in 64 32 16 8; do
echo 0 > events/kprobes/testprobe/enable echo 0 > events/kprobes/testprobe/enable
: "Confirm the arguments is recorded in given types correctly" : "Confirm the arguments is recorded in given types correctly"
ARGS=`grep "testprobe" trace | sed -e 's/.* arg1=\(.*\) arg2=\(.*\) arg3=\(.*\) arg4=\(.*\)/\1 \2 \3 \4/'` ARGS=`grep "testprobe" trace | head -n 1 | sed -e 's/.* arg1=\(.*\) arg2=\(.*\) arg3=\(.*\) arg4=\(.*\)/\1 \2 \3 \4/'`
check_types $ARGS $width check_types $ARGS $width
: "Clear event for next loop" : "Clear event for next loop"
......
...@@ -5,6 +5,8 @@ ...@@ -5,6 +5,8 @@
[ -f kprobe_events ] || exit_unsupported # this is configurable [ -f kprobe_events ] || exit_unsupported # this is configurable
grep "function" available_tracers || exit_unsupported # this is configurable grep "function" available_tracers || exit_unsupported # this is configurable
check_filter_file set_ftrace_filter
# prepare # prepare
echo nop > current_tracer echo nop > current_tracer
echo _do_fork > set_ftrace_filter echo _do_fork > set_ftrace_filter
......
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
MOUNT_CFLAGS := $(shell pkg-config --cflags mount 2>/dev/null) VAR_CFLAGS := $(shell pkg-config --cflags mount 2>/dev/null)
MOUNT_LDLIBS := $(shell pkg-config --libs mount 2>/dev/null) VAR_LDLIBS := $(shell pkg-config --libs mount 2>/dev/null)
ifeq ($(MOUNT_LDLIBS),) ifeq ($(VAR_LDLIBS),)
MOUNT_LDLIBS := -lmount -I/usr/include/libmount VAR_LDLIBS := -lmount -I/usr/include/libmount
endif endif
CFLAGS += -O2 -g -std=gnu99 -Wall -I../../../../usr/include/ $(MOUNT_CFLAGS) CFLAGS += -O2 -g -std=gnu99 -Wall -I../../../../usr/include/ $(VAR_CFLAGS)
LDLIBS += $(MOUNT_LDLIBS) LDLIBS += $(VAR_LDLIBS)
TEST_PROGS := gpio-mockup.sh TEST_PROGS := gpio-mockup.sh
TEST_FILES := gpio-mockup-sysfs.sh TEST_FILES := gpio-mockup-sysfs.sh
......
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
CFLAGS := $(CFLAGS) -Wall -D_GNU_SOURCE CFLAGS := $(CFLAGS) -Wall -D_GNU_SOURCE
LDLIBS := $(LDLIBS) -lm LDLIBS += -lm
uname_M := $(shell uname -m 2>/dev/null || echo not) uname_M := $(shell uname -m 2>/dev/null || echo not)
ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/x86/ -e s/x86_64/x86/) ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/x86/ -e s/x86_64/x86/)
......
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# kselftest_deps.sh
#
# Checks for kselftest build dependencies on the build system.
# Copyright (c) 2020 Shuah Khan <skhan@linuxfoundation.org>
#
#
usage()
{
echo -e "Usage: $0 -[p] <compiler> [test_name]\n"
echo -e "\tkselftest_deps.sh [-p] gcc"
echo -e "\tkselftest_deps.sh [-p] gcc vm"
echo -e "\tkselftest_deps.sh [-p] aarch64-linux-gnu-gcc"
echo -e "\tkselftest_deps.sh [-p] aarch64-linux-gnu-gcc vm\n"
echo "- Should be run in selftests directory in the kernel repo."
echo "- Checks if Kselftests can be built/cross-built on a system."
echo "- Parses all test/sub-test Makefile to find library dependencies."
echo "- Runs compile test on a trivial C file with LDLIBS specified"
echo " in the test Makefiles to identify missing library dependencies."
echo "- Prints suggested target list for a system filtering out tests"
echo " failed the build dependency check from the TARGETS in Selftests"
echo " main Makefile when optional -p is specified."
echo "- Prints pass/fail dependency check for each tests/sub-test."
echo "- Prints pass/fail targets and libraries."
echo "- Default: runs dependency checks on all tests."
echo "- Optional test name can be specified to check dependencies for it."
exit 1
}
# Start main()
main()
{
base_dir=`pwd`
# Make sure we're in the selftests top-level directory.
if [ $(basename "$base_dir") != "selftests" ]; then
echo -e "\tPlease run $0 in"
echo -e "\ttools/testing/selftests directory ..."
exit 1
fi
print_targets=0
while getopts "p" arg; do
case $arg in
p)
print_targets=1
shift;;
esac
done
if [ $# -eq 0 ]
then
usage
fi
# Compiler
CC=$1
tmp_file=$(mktemp).c
trap "rm -f $tmp_file.o $tmp_file $tmp_file.bin" EXIT
#echo $tmp_file
pass=$(mktemp).out
trap "rm -f $pass" EXIT
#echo $pass
fail=$(mktemp).out
trap "rm -f $fail" EXIT
#echo $fail
# Generate tmp source fire for compile test
cat << "EOF" > $tmp_file
int main()
{
}
EOF
# Save results
total_cnt=0
fail_trgts=()
fail_libs=()
fail_cnt=0
pass_trgts=()
pass_libs=()
pass_cnt=0
# Get all TARGETS from selftests Makefile
targets=$(egrep "^TARGETS +|^TARGETS =" Makefile | cut -d "=" -f2)
# Single test case
if [ $# -eq 2 ]
then
test=$2/Makefile
l1_test $test
l2_test $test
l3_test $test
print_results $1 $2
exit $?
fi
# Level 1: LDLIBS set static.
#
# Find all LDLIBS set statically for all executables built by a Makefile
# and filter out VAR_LDLIBS to discard the following:
# gpio/Makefile:LDLIBS += $(VAR_LDLIBS)
# Append space at the end of the list to append more tests.
l1_tests=$(grep -r --include=Makefile "^LDLIBS" | \
grep -v "VAR_LDLIBS" | awk -F: '{print $1}')
# Level 2: LDLIBS set dynamically.
#
# Level 2
# Some tests have multiple valid LDLIBS lines for individual sub-tests
# that need dependency checks. Find them and append them to the tests
# e.g: vm/Makefile:$(OUTPUT)/userfaultfd: LDLIBS += -lpthread
# Filter out VAR_LDLIBS to discard the following:
# memfd/Makefile:$(OUTPUT)/fuse_mnt: LDLIBS += $(VAR_LDLIBS)
# Append space at the end of the list to append more tests.
l2_tests=$(grep -r --include=Makefile ": LDLIBS" | \
grep -v "VAR_LDLIBS" | awk -F: '{print $1}')
# Level 3
# gpio, memfd and others use pkg-config to find mount and fuse libs
# respectively and save it in VAR_LDLIBS. If pkg-config doesn't find
# any, VAR_LDLIBS set to default.
# Use the default value and filter out pkg-config for dependency check.
# e.g:
# gpio/Makefile
# VAR_LDLIBS := $(shell pkg-config --libs mount) 2>/dev/null)
# memfd/Makefile
# VAR_LDLIBS := $(shell pkg-config fuse --libs 2>/dev/null)
l3_tests=$(grep -r --include=Makefile "^VAR_LDLIBS" | \
grep -v "pkg-config" | awk -F: '{print $1}')
#echo $l1_tests
#echo $l2_1_tests
#echo $l3_tests
all_tests
print_results $1 $2
exit $?
}
# end main()
all_tests()
{
for test in $l1_tests; do
l1_test $test
done
for test in $l2_tests; do
l2_test $test
done
for test in $l3_tests; do
l3_test $test
done
}
# Use same parsing used for l1_tests and pick libraries this time.
l1_test()
{
test_libs=$(grep --include=Makefile "^LDLIBS" $test | \
grep -v "VAR_LDLIBS" | \
sed -e 's/\:/ /' | \
sed -e 's/+/ /' | cut -d "=" -f 2)
check_libs $test $test_libs
}
# Use same parsing used for l2__tests and pick libraries this time.
l2_test()
{
test_libs=$(grep --include=Makefile ": LDLIBS" $test | \
grep -v "VAR_LDLIBS" | \
sed -e 's/\:/ /' | sed -e 's/+/ /' | \
cut -d "=" -f 2)
check_libs $test $test_libs
}
l3_test()
{
test_libs=$(grep --include=Makefile "^VAR_LDLIBS" $test | \
grep -v "pkg-config" | sed -e 's/\:/ /' |
sed -e 's/+/ /' | cut -d "=" -f 2)
check_libs $test $test_libs
}
check_libs()
{
if [[ ! -z "${test_libs// }" ]]
then
#echo $test_libs
for lib in $test_libs; do
let total_cnt+=1
$CC -o $tmp_file.bin $lib $tmp_file > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "FAIL: $test dependency check: $lib" >> $fail
let fail_cnt+=1
fail_libs+="$lib "
fail_target=$(echo "$test" | cut -d "/" -f1)
fail_trgts+="$fail_target "
targets=$(echo "$targets" | grep -v "$fail_target")
else
echo "PASS: $test dependency check passed $lib" >> $pass
let pass_cnt+=1
pass_libs+="$lib "
pass_trgts+="$(echo "$test" | cut -d "/" -f1) "
fi
done
fi
}
print_results()
{
echo -e "========================================================";
echo -e "Kselftest Dependency Check for [$0 $1 $2] results..."
if [ $print_targets -ne 0 ]
then
echo -e "Suggested Selftest Targets for your configuration:"
echo -e "$targets";
fi
echo -e "========================================================";
echo -e "Checked tests defining LDLIBS dependencies"
echo -e "--------------------------------------------------------";
echo -e "Total tests with Dependencies:"
echo -e "$total_cnt Pass: $pass_cnt Fail: $fail_cnt";
if [ $pass_cnt -ne 0 ]; then
echo -e "--------------------------------------------------------";
cat $pass
echo -e "--------------------------------------------------------";
echo -e "Targets passed build dependency check on system:"
echo -e "$(echo "$pass_trgts" | xargs -n1 | sort -u | xargs)"
fi
if [ $fail_cnt -ne 0 ]; then
echo -e "--------------------------------------------------------";
cat $fail
echo -e "--------------------------------------------------------";
echo -e "Targets failed build dependency check on system:"
echo -e "$(echo "$fail_trgts" | xargs -n1 | sort -u | xargs)"
echo -e "--------------------------------------------------------";
echo -e "Missing libraries system"
echo -e "$(echo "$fail_libs" | xargs -n1 | sort -u | xargs)"
fi
echo -e "--------------------------------------------------------";
echo -e "========================================================";
}
main "$@"
...@@ -8,11 +8,21 @@ TEST_GEN_PROGS := memfd_test ...@@ -8,11 +8,21 @@ TEST_GEN_PROGS := memfd_test
TEST_PROGS := run_fuse_test.sh run_hugetlbfs_test.sh TEST_PROGS := run_fuse_test.sh run_hugetlbfs_test.sh
TEST_GEN_FILES := fuse_test fuse_mnt TEST_GEN_FILES := fuse_test fuse_mnt
fuse_mnt.o: CFLAGS += $(shell pkg-config fuse --cflags) VAR_CFLAGS := $(shell pkg-config fuse --cflags 2>/dev/null)
ifeq ($(VAR_CFLAGS),)
VAR_CFLAGS := -D_FILE_OFFSET_BITS=64 -I/usr/include/fuse
endif
VAR_LDLIBS := $(shell pkg-config fuse --libs 2>/dev/null)
ifeq ($(VAR_LDLIBS),)
VAR_LDLIBS := -lfuse -pthread
endif
fuse_mnt.o: CFLAGS += $(VAR_CFLAGS)
include ../lib.mk include ../lib.mk
$(OUTPUT)/fuse_mnt: LDLIBS += $(shell pkg-config fuse --libs) $(OUTPUT)/fuse_mnt: LDLIBS += $(VAR_LDLIBS)
$(OUTPUT)/memfd_test: memfd_test.c common.c $(OUTPUT)/memfd_test: memfd_test.c common.c
$(OUTPUT)/fuse_test: fuse_test.c common.c $(OUTPUT)/fuse_test: fuse_test.c common.c
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment