^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) #!/bin/bash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) # SPDX-License-Identifier: GPL-2.0+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) # Runs the C-language litmus tests specified on standard input, using up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) # to the specified number of CPUs (defaulting to all of them) and placing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) # the results in the specified directory (defaulting to the same place
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) # the litmus test came from).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) # sh runlitmushist.sh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) # Run from the Linux kernel tools/memory-model directory.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) # This script uses environment variables produced by parseargs.sh.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) # Copyright IBM Corporation, 2018
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) # Author: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) T=/tmp/runlitmushist.sh.$$
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) trap 'rm -rf $T' 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) mkdir $T
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) if test -d litmus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) :
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) echo Directory \"litmus\" missing, aborting run.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) exit 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) # Prefixes for per-CPU scripts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) for ((i=0;i<$LKMM_JOBS;i++))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) do
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) echo dir="$LKMM_DESTDIR" > $T/$i.sh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) echo T=$T >> $T/$i.sh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) echo herdoptions=\"$LKMM_HERD_OPTIONS\" >> $T/$i.sh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) cat << '___EOF___' >> $T/$i.sh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) runtest () {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) echo ' ... ' /usr/bin/time $LKMM_TIMEOUT_CMD herd7 $herdoptions $1 '>' $dir/$1.out '2>&1'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) if /usr/bin/time $LKMM_TIMEOUT_CMD herd7 $herdoptions $1 > $dir/$1.out 2>&1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) if ! grep -q '^Observation ' $dir/$1.out
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) echo ' !!! Herd failed, no Observation:' $1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) exitcode=$?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) if test "$exitcode" -eq 124
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) exitmsg="timed out"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) exitmsg="failed, exit code $exitcode"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) echo ' !!! Herd' ${exitmsg}: $1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) fi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) ___EOF___
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) awk -v q="'" -v b='\\' '
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) print "echo `grep " q "^P[0-9]" b "+(" q " " $0 " | tail -1 | sed -e " q "s/^P" b "([0-9]" b "+" b ")(.*$/" b "1/" q "` " $0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) }' | bash |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) sort -k1n |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) awk -v ncpu=$LKMM_JOBS -v t=$T '
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) print "runtest " $2 >> t "/" NR % ncpu ".sh";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) END {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) for (i = 0; i < ncpu; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) print "sh " t "/" i ".sh > " t "/" i ".sh.out 2>&1 &";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) close(t "/" i ".sh");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) print "wait";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) }' | sh
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) cat $T/*.sh.out
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) if grep -q '!!!' $T/*.sh.out
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) echo ' ---' Summary: 1>&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) grep '!!!' $T/*.sh.out 1>&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) nfail="`grep '!!!' $T/*.sh.out | wc -l`"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) echo 'Number of failed herd7 runs (e.g., timeout): ' $nfail 1>&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) exit 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) echo All runs completed successfully. 1>&2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) exit 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) fi