1#!/bin/bash 2 3TESTS="$@" 4RET=0 5TIMEOUT=60 6DMESG_FILTER="cat" 7TEST_DIR=$(dirname $0) 8FAILED="" 9SKIPPED="" 10MAYBE_FAILED="" 11TEST_FILES="" 12declare -A TEST_MAP 13 14# Only use /dev/kmsg if running as root 15DO_KMSG="1" 16[ "$(id -u)" != "0" ] && DO_KMSG="0" 17 18# Include config.local if exists and check TEST_FILES for valid devices 19if [ -f "$TEST_DIR/config.local" ]; then 20 . $TEST_DIR/config.local 21 for dev in $TEST_FILES; do 22 if [ ! -e "$dev" ]; then 23 echo "Test file $dev not valid" 24 exit 1 25 fi 26 done 27 for dev in ${TEST_MAP[@]}; do 28 if [ ! -e "$dev" ]; then 29 echo "Test file in map $dev not valid" 30 exit 1 31 fi 32 done 33fi 34 35_check_dmesg() 36{ 37 local dmesg_marker="$1" 38 local seqres="$2.seqres" 39 40 if [ $DO_KMSG -eq 0 ]; then 41 return 0 42 fi 43 44 dmesg | bash -c "$DMESG_FILTER" | grep -A 9999 "$dmesg_marker" >"${seqres}.dmesg" 45 grep -q -e "kernel BUG at" \ 46 -e "WARNING:" \ 47 -e "BUG:" \ 48 -e "Oops:" \ 49 -e "possible recursive locking detected" \ 50 -e "Internal error" \ 51 -e "INFO: suspicious RCU usage" \ 52 -e "INFO: possible circular locking dependency detected" \ 53 -e "general protection fault:" \ 54 -e "blktests failure" \ 55 "${seqres}.dmesg" 56 # shellcheck disable=SC2181 57 if [[ $? -eq 0 ]]; then 58 return 1 59 else 60 rm -f "${seqres}.dmesg" 61 return 0 62 fi 63} 64 65run_test() 66{ 67 local test_name="$1" 68 local dev="$2" 69 local test_string=$test_name 70 71 # Specify test string to print 72 if [ -n "$dev" ]; then 73 test_string="$test_name $dev" 74 fi 75 76 # Log start of the test 77 if [ "$DO_KMSG" -eq 1 ]; then 78 local dmesg_marker="Running test $test_string:" 79 echo $dmesg_marker | tee /dev/kmsg 80 else 81 local dmesg_marker="" 82 echo Running test $test_name $dev 83 fi 84 85 # Do we have to exclude the test ? 86 echo $TEST_EXCLUDE | grep -w "$test_name" > /dev/null 2>&1 87 if [ $? -eq 0 ]; then 88 echo "Test skipped" 89 SKIPPED="$SKIPPED <$test_string>" 90 return 91 fi 92 93 # Run the test 94 timeout -s INT -k $TIMEOUT $TIMEOUT ./$test_name $dev 95 local status=$? 96 97 # Check test status 98 if [ "$status" -eq 124 ]; then 99 echo "Test $test_name timed out (may not be a failure)" 100 elif [ "$status" -ne 0 ]; then 101 echo "Test $test_name failed with ret $status" 102 FAILED="$FAILED <$test_string>" 103 RET=1 104 elif ! _check_dmesg "$dmesg_marker" "$test_name"; then 105 echo "Test $test_name failed dmesg check" 106 FAILED="$FAILED <$test_string>" 107 RET=1 108 elif [ -n "$dev" ]; then 109 sleep .1 110 ps aux | grep "\[io_wq_manager\]" > /dev/null 111 if [ $? -eq 0 ]; then 112 MAYBE_FAILED="$MAYBE_FAILED $test_string" 113 fi 114 fi 115} 116 117# Run all specified tests 118for tst in $TESTS; do 119 if [ ! -n "${TEST_MAP[$tst]}" ]; then 120 run_test $tst 121 if [ ! -z "$TEST_FILES" ]; then 122 for dev in $TEST_FILES; do 123 run_test $tst $dev 124 done 125 fi 126 else 127 run_test $tst ${TEST_MAP[$tst]} 128 fi 129done 130 131if [ -n "$SKIPPED" ]; then 132 echo "Tests skipped: $SKIPPED" 133fi 134 135if [ "${RET}" -ne 0 ]; then 136 echo "Tests failed: $FAILED" 137 exit $RET 138else 139 sleep 1 140 ps aux | grep "\[io_wq_manager\]" > /dev/null 141 if [ $? -ne 0 ]; then 142 MAYBE_FAILED="" 143 fi 144 if [ ! -z "$MAYBE_FAILED" ]; then 145 echo "Tests _maybe_ failed: $MAYBE_FAILED" 146 fi 147 echo "All tests passed" 148 exit 0 149fi 150