162306a36Sopenharmony_ci#!/bin/bash
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0+
362306a36Sopenharmony_ci#
462306a36Sopenharmony_ci# Carry out a kvm-based run for the specified batch of scenarios, which
562306a36Sopenharmony_ci# might have been built by --build-only kvm.sh run.
662306a36Sopenharmony_ci#
762306a36Sopenharmony_ci# Usage: kvm-test-1-run-batch.sh SCENARIO [ SCENARIO ... ]
862306a36Sopenharmony_ci#
962306a36Sopenharmony_ci# Each SCENARIO is the name of a directory in the current directory
1062306a36Sopenharmony_ci#	containing a ready-to-run qemu-cmd file.
1162306a36Sopenharmony_ci#
1262306a36Sopenharmony_ci# Copyright (C) 2021 Facebook, Inc.
1362306a36Sopenharmony_ci#
1462306a36Sopenharmony_ci# Authors: Paul E. McKenney <paulmck@kernel.org>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ciT="`mktemp -d ${TMPDIR-/tmp}/kvm-test-1-run-batch.sh.XXXXXX`"
1762306a36Sopenharmony_citrap 'rm -rf $T' 0
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ciecho ---- Running batch $*
2062306a36Sopenharmony_ci# Check arguments
2162306a36Sopenharmony_cirunfiles=
2262306a36Sopenharmony_cifor i in "$@"
2362306a36Sopenharmony_cido
2462306a36Sopenharmony_ci	if ! echo $i | grep -q '^[^/.a-z]\+\(\.[0-9]\+\)\?$'
2562306a36Sopenharmony_ci	then
2662306a36Sopenharmony_ci		echo Bad scenario name: \"$i\" 1>&2
2762306a36Sopenharmony_ci		exit 1
2862306a36Sopenharmony_ci	fi
2962306a36Sopenharmony_ci	if ! test -d "$i"
3062306a36Sopenharmony_ci	then
3162306a36Sopenharmony_ci		echo Scenario name not a directory: \"$i\" 1>&2
3262306a36Sopenharmony_ci		exit 2
3362306a36Sopenharmony_ci	fi
3462306a36Sopenharmony_ci	if ! test -f "$i/qemu-cmd"
3562306a36Sopenharmony_ci	then
3662306a36Sopenharmony_ci		echo Scenario lacks a command file: \"$i/qemu-cmd\" 1>&2
3762306a36Sopenharmony_ci		exit 3
3862306a36Sopenharmony_ci	fi
3962306a36Sopenharmony_ci	rm -f $i/build.*
4062306a36Sopenharmony_ci	touch $i/build.run
4162306a36Sopenharmony_ci	runfiles="$runfiles $i/build.run"
4262306a36Sopenharmony_cidone
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci# Extract settings from the qemu-cmd file.
4562306a36Sopenharmony_cigrep '^#' $1/qemu-cmd | sed -e 's/^# //' > $T/qemu-cmd-settings
4662306a36Sopenharmony_ci. $T/qemu-cmd-settings
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci# Start up jitter, start each scenario, wait, end jitter.
4962306a36Sopenharmony_ciecho ---- System running test: `uname -a`
5062306a36Sopenharmony_ciecho ---- Starting kernels. `date` | tee -a log
5162306a36Sopenharmony_ci$TORTURE_JITTER_START
5262306a36Sopenharmony_cikvm-assign-cpus.sh /sys/devices/system/node > $T/cpuarray.awk
5362306a36Sopenharmony_cifor i in "$@"
5462306a36Sopenharmony_cido
5562306a36Sopenharmony_ci	echo ---- System running test: `uname -a` > $i/kvm-test-1-run-qemu.sh.out
5662306a36Sopenharmony_ci	echo > $i/kvm-test-1-run-qemu.sh.out
5762306a36Sopenharmony_ci	export TORTURE_AFFINITY=
5862306a36Sopenharmony_ci	kvm-get-cpus-script.sh $T/cpuarray.awk $T/cpubatches.awk $T/cpustate
5962306a36Sopenharmony_ci	cat << '	___EOF___' >> $T/cpubatches.awk
6062306a36Sopenharmony_ci	END {
6162306a36Sopenharmony_ci		affinitylist = "";
6262306a36Sopenharmony_ci		if (!gotcpus()) {
6362306a36Sopenharmony_ci			print "echo No CPU-affinity information, so no taskset command.";
6462306a36Sopenharmony_ci		} else if (cpu_count !~ /^[0-9][0-9]*$/) {
6562306a36Sopenharmony_ci			print "echo " scenario ": Bogus number of CPUs (old qemu-cmd?), so no taskset command.";
6662306a36Sopenharmony_ci		} else {
6762306a36Sopenharmony_ci			affinitylist = nextcpus(cpu_count);
6862306a36Sopenharmony_ci			if (!(affinitylist ~ /^[0-9,-][0-9,-]*$/))
6962306a36Sopenharmony_ci				print "echo " scenario ": Bogus CPU-affinity information, so no taskset command.";
7062306a36Sopenharmony_ci			else if (!dumpcpustate())
7162306a36Sopenharmony_ci				print "echo " scenario ": Could not dump state, so no taskset command.";
7262306a36Sopenharmony_ci			else
7362306a36Sopenharmony_ci				print "export TORTURE_AFFINITY=" affinitylist;
7462306a36Sopenharmony_ci		}
7562306a36Sopenharmony_ci	}
7662306a36Sopenharmony_ci	___EOF___
7762306a36Sopenharmony_ci	cpu_count="`grep '# TORTURE_CPU_COUNT=' $i/qemu-cmd | sed -e 's/^.*=//'`"
7862306a36Sopenharmony_ci	affinity_export="`awk -f $T/cpubatches.awk -v cpu_count="$cpu_count" -v scenario=$i < /dev/null`"
7962306a36Sopenharmony_ci	$affinity_export
8062306a36Sopenharmony_ci	kvm-test-1-run-qemu.sh $i >> $i/kvm-test-1-run-qemu.sh.out 2>&1 &
8162306a36Sopenharmony_cidone
8262306a36Sopenharmony_cifor i in $runfiles
8362306a36Sopenharmony_cido
8462306a36Sopenharmony_ci	while ls $i > /dev/null 2>&1
8562306a36Sopenharmony_ci	do
8662306a36Sopenharmony_ci		:
8762306a36Sopenharmony_ci	done
8862306a36Sopenharmony_cidone
8962306a36Sopenharmony_ciecho ---- All kernel runs complete. `date` | tee -a log
9062306a36Sopenharmony_ci$TORTURE_JITTER_STOP
91