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