162306a36Sopenharmony_ci#!/bin/bash
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0+
362306a36Sopenharmony_ci#
462306a36Sopenharmony_ci# Runs the C-language litmus tests specified on standard input, using up
562306a36Sopenharmony_ci# to the specified number of CPUs (defaulting to all of them) and placing
662306a36Sopenharmony_ci# the results in the specified directory (defaulting to the same place
762306a36Sopenharmony_ci# the litmus test came from).
862306a36Sopenharmony_ci#
962306a36Sopenharmony_ci# sh runlitmushist.sh
1062306a36Sopenharmony_ci#
1162306a36Sopenharmony_ci# Run from the Linux kernel tools/memory-model directory.
1262306a36Sopenharmony_ci# This script uses environment variables produced by parseargs.sh.
1362306a36Sopenharmony_ci#
1462306a36Sopenharmony_ci# Copyright IBM Corporation, 2018
1562306a36Sopenharmony_ci#
1662306a36Sopenharmony_ci# Author: Paul E. McKenney <paulmck@linux.ibm.com>
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci. scripts/hwfnseg.sh
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ciT=/tmp/runlitmushist.sh.$$
2162306a36Sopenharmony_citrap 'rm -rf $T' 0
2262306a36Sopenharmony_cimkdir $T
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ciif test -d litmus
2562306a36Sopenharmony_cithen
2662306a36Sopenharmony_ci	:
2762306a36Sopenharmony_cielse
2862306a36Sopenharmony_ci	echo Directory \"litmus\" missing, aborting run.
2962306a36Sopenharmony_ci	exit 1
3062306a36Sopenharmony_cifi
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci# Prefixes for per-CPU scripts
3362306a36Sopenharmony_cifor ((i=0;i<$LKMM_JOBS;i++))
3462306a36Sopenharmony_cido
3562306a36Sopenharmony_ci	echo T=$T >> $T/$i.sh
3662306a36Sopenharmony_ci	cat << '___EOF___' >> $T/$i.sh
3762306a36Sopenharmony_ci	runtest () {
3862306a36Sopenharmony_ci		if scripts/runlitmus.sh $1
3962306a36Sopenharmony_ci		then
4062306a36Sopenharmony_ci			if ! grep -q '^Observation ' $LKMM_DESTDIR/$1$2.out
4162306a36Sopenharmony_ci			then
4262306a36Sopenharmony_ci				echo ' !!! Herd failed, no Observation:' $1
4362306a36Sopenharmony_ci			fi
4462306a36Sopenharmony_ci		else
4562306a36Sopenharmony_ci			exitcode=$?
4662306a36Sopenharmony_ci			if test "$exitcode" -eq 124
4762306a36Sopenharmony_ci			then
4862306a36Sopenharmony_ci				exitmsg="timed out"
4962306a36Sopenharmony_ci			elif test "$exitcode" -eq 253
5062306a36Sopenharmony_ci			then
5162306a36Sopenharmony_ci				exitmsg=
5262306a36Sopenharmony_ci			else
5362306a36Sopenharmony_ci				exitmsg="failed, exit code $exitcode"
5462306a36Sopenharmony_ci			fi
5562306a36Sopenharmony_ci			if test -n "$exitmsg"
5662306a36Sopenharmony_ci			then
5762306a36Sopenharmony_ci				echo ' !!! Herd' ${exitmsg}: $1
5862306a36Sopenharmony_ci			fi
5962306a36Sopenharmony_ci		fi
6062306a36Sopenharmony_ci	}
6162306a36Sopenharmony_ci___EOF___
6262306a36Sopenharmony_cidone
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ciawk -v q="'" -v b='\\' '
6562306a36Sopenharmony_ci{
6662306a36Sopenharmony_ci	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
6762306a36Sopenharmony_ci}' | sh | sort -k1n |
6862306a36Sopenharmony_ciawk -v dq='"' -v hwfnseg="$hwfnseg" -v ncpu="$LKMM_JOBS" -v t="$T" '
6962306a36Sopenharmony_ci{
7062306a36Sopenharmony_ci	print "if test -z " dq hwfnseg dq " || scripts/simpletest.sh " dq $2 dq
7162306a36Sopenharmony_ci	print "then"
7262306a36Sopenharmony_ci	print "\techo runtest " dq $2 dq " " hwfnseg " >> " t "/" NR % ncpu ".sh";
7362306a36Sopenharmony_ci	print "fi"
7462306a36Sopenharmony_ci}
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ciEND {
7762306a36Sopenharmony_ci	for (i = 0; i < ncpu; i++) {
7862306a36Sopenharmony_ci		print "sh " t "/" i ".sh > " t "/" i ".sh.out 2>&1 &";
7962306a36Sopenharmony_ci		close(t "/" i ".sh");
8062306a36Sopenharmony_ci	}
8162306a36Sopenharmony_ci	print "wait";
8262306a36Sopenharmony_ci}' | sh
8362306a36Sopenharmony_cicat $T/*.sh.out
8462306a36Sopenharmony_ciif grep -q '!!!' $T/*.sh.out
8562306a36Sopenharmony_cithen
8662306a36Sopenharmony_ci	echo ' ---' Summary: 1>&2
8762306a36Sopenharmony_ci	grep '!!!' $T/*.sh.out 1>&2
8862306a36Sopenharmony_ci	nfail="`grep '!!!' $T/*.sh.out | wc -l`"
8962306a36Sopenharmony_ci	echo 'Number of failed herd7 runs (e.g., timeout): ' $nfail 1>&2
9062306a36Sopenharmony_ci	exit 1
9162306a36Sopenharmony_cielse
9262306a36Sopenharmony_ci	echo All runs completed successfully. 1>&2
9362306a36Sopenharmony_ci	exit 0
9462306a36Sopenharmony_cifi
95