| #!/bin/bash |
| |
| TESTS="$@" |
| RET=0 |
| |
| TIMEOUT=60 |
| FAILED="" |
| MAYBE_FAILED="" |
| |
| do_kmsg="1" |
| if ! [ $(id -u) = 0 ]; then |
| do_kmsg="0" |
| fi |
| |
| TEST_DIR=$(dirname $0) |
| TEST_FILES="" |
| if [ -f "$TEST_DIR/config.local" ]; then |
| . $TEST_DIR/config.local |
| for dev in $TEST_FILES; do |
| if [ ! -e "$dev" ]; then |
| echo "Test file $dev not valid" |
| exit 1 |
| fi |
| done |
| fi |
| |
| _check_dmesg() |
| { |
| local dmesg_marker="$1" |
| local seqres="$2.seqres" |
| |
| if [[ $do_kmsg -eq 0 ]]; then |
| return 0 |
| fi |
| |
| dmesg | bash -c "$DMESG_FILTER" | grep -A 9999 "$dmesg_marker" >"${seqres}.dmesg" |
| grep -q -e "kernel BUG at" \ |
| -e "WARNING:" \ |
| -e "BUG:" \ |
| -e "Oops:" \ |
| -e "possible recursive locking detected" \ |
| -e "Internal error" \ |
| -e "INFO: suspicious RCU usage" \ |
| -e "INFO: possible circular locking dependency detected" \ |
| -e "general protection fault:" \ |
| -e "blktests failure" \ |
| "${seqres}.dmesg" |
| # shellcheck disable=SC2181 |
| if [[ $? -eq 0 ]]; then |
| return 1 |
| else |
| rm -f "${seqres}.dmesg" |
| return 0 |
| fi |
| } |
| |
| run_test() |
| { |
| T="$1" |
| D="$2" |
| DMESG_FILTER="cat" |
| |
| if [ "$do_kmsg" -eq 1 ]; then |
| if [ -z "$D" ]; then |
| local dmesg_marker="Running test $T:" |
| else |
| local dmesg_marker="Running test $T $D:" |
| fi |
| echo $dmesg_marker | tee /dev/kmsg |
| else |
| local dmesg_marker="" |
| echo Running test $T $D |
| fi |
| timeout --preserve-status -s INT $TIMEOUT ./$T $D |
| r=$? |
| if [ "${r}" -eq 124 ]; then |
| echo "Test $T timed out (may not be a failure)" |
| elif [ "${r}" -ne 0 ]; then |
| echo "Test $T failed with ret ${r}" |
| if [ -z "$D" ]; then |
| FAILED="$FAILED <$T>" |
| else |
| FAILED="$FAILED <$T $D>" |
| fi |
| RET=1 |
| elif ! _check_dmesg "$dmesg_marker" "$T"; then |
| echo "Test $T failed dmesg check" |
| if [ -z "$D" ]; then |
| FAILED="$FAILED <$T>" |
| else |
| FAILED="$FAILED <$T $D>" |
| fi |
| RET=1 |
| elif [ ! -z "$D" ]; then |
| sleep .1 |
| ps aux | grep "\[io_wq_manager\]" > /dev/null |
| R="$?" |
| if [ "$R" -eq 0 ]; then |
| MAYBE_FAILED="$MAYBE_FAILED $T" |
| fi |
| fi |
| } |
| |
| for t in $TESTS; do |
| run_test $t |
| if [ ! -z "$TEST_FILES" ]; then |
| for dev in $TEST_FILES; do |
| run_test $t $dev |
| done |
| fi |
| done |
| |
| if [ "${RET}" -ne 0 ]; then |
| echo "Tests $FAILED failed" |
| exit $RET |
| else |
| sleep 1 |
| ps aux | grep "\[io_wq_manager\]" > /dev/null |
| R="$?" |
| if [ "$R" -ne 0 ]; then |
| MAYBE_FAILED="" |
| fi |
| if [ ! -z "$MAYBE_FAILED" ]; then |
| echo "Tests _maybe_ failed: $MAYBE_FAILED" |
| fi |
| echo "All tests passed" |
| exit 0 |
| fi |