File Index
Files and directories
Sign in
FILE

run.sh

File preview with syntax highlighting.

linux-6.19.14/tools/testing/selftests/lkdtm/run.sh BASH
  1#!/bin/sh
  2# SPDX-License-Identifier: GPL-2.0
  3#
  4# This reads tests.txt for the list of LKDTM tests to invoke. Any marked
  5# with a leading "#" are skipped. The rest of the line after the
  6# test name is either the text to look for in dmesg for a "success",
  7# or the rationale for why a test is marked to be skipped.
  8#
  9set -e
 10TRIGGER=/sys/kernel/debug/provoke-crash/DIRECT
 11CLEAR_ONCE=/sys/kernel/debug/clear_warn_once
 12KSELFTEST_SKIP_TEST=4
 13
 14# Verify we have LKDTM available in the kernel.
 15if [ ! -r $TRIGGER ] ; then
 16	/sbin/modprobe -q lkdtm || true
 17	if [ ! -r $TRIGGER ] ; then
 18		echo "Cannot find $TRIGGER (missing CONFIG_LKDTM?)"
 19	else
 20		echo "Cannot write $TRIGGER (need to run as root?)"
 21	fi
 22	# Skip this test
 23	exit $KSELFTEST_SKIP_TEST
 24fi
 25
 26# Figure out which test to run from our script name.
 27test=$(basename $0 .sh)
 28# Look up details about the test from master list of LKDTM tests.
 29line=$(grep -E '^#?'"$test"'\b' tests.txt)
 30if [ -z "$line" ]; then
 31	echo "Skipped: missing test '$test' in tests.txt"
 32	exit $KSELFTEST_SKIP_TEST
 33fi
 34# Check that the test is known to LKDTM.
 35if ! grep -E -q '^'"$test"'$' "$TRIGGER" ; then
 36	echo "Skipped: test '$test' missing in $TRIGGER!"
 37	exit $KSELFTEST_SKIP_TEST
 38fi
 39
 40# Extract notes/expected output from test list.
 41test=$(echo "$line" | cut -d" " -f1)
 42if echo "$line" | grep -q ' ' ; then
 43	expect=$(echo "$line" | cut -d" " -f2-)
 44else
 45	expect=""
 46fi
 47
 48# If the test is commented out, report a skip
 49if echo "$test" | grep -q '^#' ; then
 50	test=$(echo "$test" | cut -c2-)
 51	if [ -z "$expect" ]; then
 52		expect="crashes entire system"
 53	fi
 54	echo "Skipping $test: $expect"
 55	exit $KSELFTEST_SKIP_TEST
 56fi
 57
 58# If no expected output given, assume an Oops with back trace is success.
 59repeat=1
 60if [ -z "$expect" ]; then
 61	expect="call trace:"
 62else
 63	if echo "$expect" | grep -q '^repeat:' ; then
 64		repeat=$(echo "$expect" | cut -d' ' -f1 | cut -d: -f2)
 65		expect=$(echo "$expect" | cut -d' ' -f2-)
 66	fi
 67fi
 68
 69# Prepare log for report checking
 70LOG=$(mktemp --tmpdir -t lkdtm-log-XXXXXX)
 71DMESG=$(mktemp --tmpdir -t lkdtm-dmesg-XXXXXX)
 72cleanup() {
 73	rm -f "$LOG" "$DMESG"
 74}
 75trap cleanup EXIT
 76
 77# Reset WARN_ONCE counters so we trip it each time this runs.
 78if [ -w $CLEAR_ONCE ] ; then
 79	echo 1 > $CLEAR_ONCE
 80fi
 81
 82# Save existing dmesg so we can detect new content below
 83dmesg > "$DMESG"
 84
 85# Since the kernel is likely killing the process writing to the trigger
 86# file, it must not be the script's shell itself. i.e. we cannot do:
 87#     echo "$test" >"$TRIGGER"
 88# Instead, use "cat" to take the signal. Since the shell will yell about
 89# the signal that killed the subprocess, we must ignore the failure and
 90# continue. However we don't silence stderr since there might be other
 91# useful details reported there in the case of other unexpected conditions.
 92for i in $(seq 1 $repeat); do
 93	echo "$test" | cat >"$TRIGGER" || true
 94done
 95
 96# Record and dump the results
 97dmesg | comm --nocheck-order -13 "$DMESG" - > "$LOG" || true
 98
 99cat "$LOG"
100# Check for expected output
101if grep -E -qi "$expect" "$LOG" ; then
102	echo "$test: saw '$expect': ok"
103	exit 0
104else
105	if grep -E -qi XFAIL: "$LOG" ; then
106		echo "$test: saw 'XFAIL': [SKIP]"
107		exit $KSELFTEST_SKIP_TEST
108	else
109		echo "$test: missing '$expect': [FAIL]"
110		exit 1
111	fi
112fi
~/ Read-only file preview.