162306a36Sopenharmony_ci#!/bin/bash
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0+
362306a36Sopenharmony_ci#
462306a36Sopenharmony_ci# Rerun a series of tests under KVM.
562306a36Sopenharmony_ci#
662306a36Sopenharmony_ci# Usage: kvm-again.sh /path/to/old/run [ options ]
762306a36Sopenharmony_ci#
862306a36Sopenharmony_ci# Copyright (C) 2021 Facebook, Inc.
962306a36Sopenharmony_ci#
1062306a36Sopenharmony_ci# Authors: Paul E. McKenney <paulmck@kernel.org>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ciscriptname=$0
1362306a36Sopenharmony_ciargs="$*"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ciT="`mktemp -d ${TMPDIR-/tmp}/kvm-again.sh.XXXXXX`"
1662306a36Sopenharmony_citrap 'rm -rf $T' 0
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ciif ! test -d tools/testing/selftests/rcutorture/bin
1962306a36Sopenharmony_cithen
2062306a36Sopenharmony_ci	echo $scriptname must be run from top-level directory of kernel source tree.
2162306a36Sopenharmony_ci	exit 1
2262306a36Sopenharmony_cifi
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_cioldrun=$1
2562306a36Sopenharmony_cishift
2662306a36Sopenharmony_ciif ! test -d "$oldrun"
2762306a36Sopenharmony_cithen
2862306a36Sopenharmony_ci	echo "Usage: $scriptname /path/to/old/run [ options ]"
2962306a36Sopenharmony_ci	exit 1
3062306a36Sopenharmony_cifi
3162306a36Sopenharmony_ciif ! cp "$oldrun/scenarios" $T/scenarios.oldrun
3262306a36Sopenharmony_cithen
3362306a36Sopenharmony_ci	# Later on, can reconstitute this from console.log files.
3462306a36Sopenharmony_ci	echo Prior run batches file does not exist: $oldrun/batches
3562306a36Sopenharmony_ci	exit 1
3662306a36Sopenharmony_cifi
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ciif test -f "$oldrun/torture_suite"
3962306a36Sopenharmony_cithen
4062306a36Sopenharmony_ci	torture_suite="`cat $oldrun/torture_suite`"
4162306a36Sopenharmony_cielif test -f "$oldrun/TORTURE_SUITE"
4262306a36Sopenharmony_cithen
4362306a36Sopenharmony_ci	torture_suite="`cat $oldrun/TORTURE_SUITE`"
4462306a36Sopenharmony_cielse
4562306a36Sopenharmony_ci	echo "Prior run torture_suite file does not exist: $oldrun/{torture_suite,TORTURE_SUITE}"
4662306a36Sopenharmony_ci	exit 1
4762306a36Sopenharmony_cifi
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ciRCUTORTURE="`pwd`/tools/testing/selftests/rcutorture"; export RCUTORTURE
5062306a36Sopenharmony_ciPATH=${RCUTORTURE}/bin:$PATH; export PATH
5162306a36Sopenharmony_ci. functions.sh
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cibootargs=
5462306a36Sopenharmony_cidryrun=
5562306a36Sopenharmony_cidur=
5662306a36Sopenharmony_cidefault_link="cp -R"
5762306a36Sopenharmony_ciresdir="`pwd`/tools/testing/selftests/rcutorture/res"
5862306a36Sopenharmony_cirundir="$resdir/`date +%Y.%m.%d-%H.%M.%S-again`"
5962306a36Sopenharmony_cigot_datestamp=
6062306a36Sopenharmony_cigot_rundir=
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_cistartdate="`date`"
6362306a36Sopenharmony_cistarttime="`get_starttime`"
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ciusage () {
6662306a36Sopenharmony_ci	echo "Usage: $scriptname $oldrun [ arguments ]:"
6762306a36Sopenharmony_ci	echo "       --bootargs kernel-boot-arguments"
6862306a36Sopenharmony_ci	echo "       --datestamp string"
6962306a36Sopenharmony_ci	echo "       --dryrun"
7062306a36Sopenharmony_ci	echo "       --duration minutes | <seconds>s | <hours>h | <days>d"
7162306a36Sopenharmony_ci	echo "       --link hard|soft|copy"
7262306a36Sopenharmony_ci	echo "       --remote"
7362306a36Sopenharmony_ci	echo "       --rundir /new/res/path"
7462306a36Sopenharmony_ci	echo "Command line: $scriptname $args"
7562306a36Sopenharmony_ci	exit 1
7662306a36Sopenharmony_ci}
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ciwhile test $# -gt 0
7962306a36Sopenharmony_cido
8062306a36Sopenharmony_ci	case "$1" in
8162306a36Sopenharmony_ci	--bootargs|--bootarg)
8262306a36Sopenharmony_ci		checkarg --bootargs "(list of kernel boot arguments)" "$#" "$2" '.*' '^--'
8362306a36Sopenharmony_ci		bootargs="$bootargs $2"
8462306a36Sopenharmony_ci		shift
8562306a36Sopenharmony_ci		;;
8662306a36Sopenharmony_ci	--datestamp)
8762306a36Sopenharmony_ci		checkarg --datestamp "(relative pathname)" "$#" "$2" '^[a-zA-Z0-9._/-]*$' '^--'
8862306a36Sopenharmony_ci		if test -n "$got_rundir" || test -n "$got_datestamp"
8962306a36Sopenharmony_ci		then
9062306a36Sopenharmony_ci			echo Only one of --datestamp or --rundir may be specified
9162306a36Sopenharmony_ci			usage
9262306a36Sopenharmony_ci		fi
9362306a36Sopenharmony_ci		got_datestamp=y
9462306a36Sopenharmony_ci		ds=$2
9562306a36Sopenharmony_ci		rundir="$resdir/$ds"
9662306a36Sopenharmony_ci		if test -e "$rundir"
9762306a36Sopenharmony_ci		then
9862306a36Sopenharmony_ci			echo "--datestamp $2: Already exists."
9962306a36Sopenharmony_ci			usage
10062306a36Sopenharmony_ci		fi
10162306a36Sopenharmony_ci		shift
10262306a36Sopenharmony_ci		;;
10362306a36Sopenharmony_ci	--dryrun)
10462306a36Sopenharmony_ci		dryrun=1
10562306a36Sopenharmony_ci		;;
10662306a36Sopenharmony_ci	--duration)
10762306a36Sopenharmony_ci		checkarg --duration "(minutes)" $# "$2" '^[0-9][0-9]*\(s\|m\|h\|d\|\)$' '^error'
10862306a36Sopenharmony_ci		mult=60
10962306a36Sopenharmony_ci		if echo "$2" | grep -q 's$'
11062306a36Sopenharmony_ci		then
11162306a36Sopenharmony_ci			mult=1
11262306a36Sopenharmony_ci		elif echo "$2" | grep -q 'h$'
11362306a36Sopenharmony_ci		then
11462306a36Sopenharmony_ci			mult=3600
11562306a36Sopenharmony_ci		elif echo "$2" | grep -q 'd$'
11662306a36Sopenharmony_ci		then
11762306a36Sopenharmony_ci			mult=86400
11862306a36Sopenharmony_ci		fi
11962306a36Sopenharmony_ci		ts=`echo $2 | sed -e 's/[smhd]$//'`
12062306a36Sopenharmony_ci		dur=$(($ts*mult))
12162306a36Sopenharmony_ci		shift
12262306a36Sopenharmony_ci		;;
12362306a36Sopenharmony_ci	--link)
12462306a36Sopenharmony_ci		checkarg --link "hard|soft|copy" "$#" "$2" 'hard\|soft\|copy' '^--'
12562306a36Sopenharmony_ci		case "$2" in
12662306a36Sopenharmony_ci		copy)
12762306a36Sopenharmony_ci			arg_link="cp -R"
12862306a36Sopenharmony_ci			;;
12962306a36Sopenharmony_ci		hard)
13062306a36Sopenharmony_ci			arg_link="cp -Rl"
13162306a36Sopenharmony_ci			;;
13262306a36Sopenharmony_ci		soft)
13362306a36Sopenharmony_ci			arg_link="cp -Rs"
13462306a36Sopenharmony_ci			;;
13562306a36Sopenharmony_ci		esac
13662306a36Sopenharmony_ci		shift
13762306a36Sopenharmony_ci		;;
13862306a36Sopenharmony_ci	--remote)
13962306a36Sopenharmony_ci		arg_remote=1
14062306a36Sopenharmony_ci		default_link="cp -as"
14162306a36Sopenharmony_ci		;;
14262306a36Sopenharmony_ci	--rundir)
14362306a36Sopenharmony_ci		checkarg --rundir "(absolute pathname)" "$#" "$2" '^/' '^error'
14462306a36Sopenharmony_ci		if test -n "$got_rundir" || test -n "$got_datestamp"
14562306a36Sopenharmony_ci		then
14662306a36Sopenharmony_ci			echo Only one of --datestamp or --rundir may be specified
14762306a36Sopenharmony_ci			usage
14862306a36Sopenharmony_ci		fi
14962306a36Sopenharmony_ci		got_rundir=y
15062306a36Sopenharmony_ci		rundir=$2
15162306a36Sopenharmony_ci		if test -e "$rundir"
15262306a36Sopenharmony_ci		then
15362306a36Sopenharmony_ci			echo "--rundir $2: Already exists."
15462306a36Sopenharmony_ci			usage
15562306a36Sopenharmony_ci		fi
15662306a36Sopenharmony_ci		shift
15762306a36Sopenharmony_ci		;;
15862306a36Sopenharmony_ci	*)
15962306a36Sopenharmony_ci		if test -n "$1"
16062306a36Sopenharmony_ci		then
16162306a36Sopenharmony_ci			echo Unknown argument $1
16262306a36Sopenharmony_ci			usage
16362306a36Sopenharmony_ci		fi
16462306a36Sopenharmony_ci		;;
16562306a36Sopenharmony_ci	esac
16662306a36Sopenharmony_ci	shift
16762306a36Sopenharmony_cidone
16862306a36Sopenharmony_ciif test -z "$arg_link"
16962306a36Sopenharmony_cithen
17062306a36Sopenharmony_ci	arg_link="$default_link"
17162306a36Sopenharmony_cifi
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ciecho ---- Re-run results directory: $rundir
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_ci# Copy old run directory tree over and adjust.
17662306a36Sopenharmony_cimkdir -p "`dirname "$rundir"`"
17762306a36Sopenharmony_ciif ! $arg_link "$oldrun" "$rundir"
17862306a36Sopenharmony_cithen
17962306a36Sopenharmony_ci	echo "Cannot copy from $oldrun to $rundir."
18062306a36Sopenharmony_ci	usage
18162306a36Sopenharmony_cifi
18262306a36Sopenharmony_cirm -f "$rundir"/*/{console.log,console.log.diags,qemu_pid,qemu-pid,qemu-retval,Warnings,kvm-test-1-run.sh.out,kvm-test-1-run-qemu.sh.out,vmlinux} "$rundir"/log
18362306a36Sopenharmony_citouch "$rundir/log"
18462306a36Sopenharmony_ciecho $scriptname $args | tee -a "$rundir/log"
18562306a36Sopenharmony_ciecho $oldrun > "$rundir/re-run"
18662306a36Sopenharmony_ciif ! test -d "$rundir/../../bin"
18762306a36Sopenharmony_cithen
18862306a36Sopenharmony_ci	$arg_link "$oldrun/../../bin" "$rundir/../.."
18962306a36Sopenharmony_cifi
19062306a36Sopenharmony_cifor i in $rundir/*/qemu-cmd
19162306a36Sopenharmony_cido
19262306a36Sopenharmony_ci	cp "$i" $T
19362306a36Sopenharmony_ci	qemu_cmd_dir="`dirname "$i"`"
19462306a36Sopenharmony_ci	kernel_dir="`echo $qemu_cmd_dir | sed -e 's/\.[0-9]\+$//'`"
19562306a36Sopenharmony_ci	jitter_dir="`dirname "$kernel_dir"`"
19662306a36Sopenharmony_ci	kvm-transform.sh "$kernel_dir/bzImage" "$qemu_cmd_dir/console.log" "$jitter_dir" "$dur" "$bootargs" < $T/qemu-cmd > $i
19762306a36Sopenharmony_ci	if test -n "$arg_remote"
19862306a36Sopenharmony_ci	then
19962306a36Sopenharmony_ci		echo "# TORTURE_KCONFIG_GDB_ARG=''" >> $i
20062306a36Sopenharmony_ci	fi
20162306a36Sopenharmony_cidone
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ci# Extract settings from the last qemu-cmd file transformed above.
20462306a36Sopenharmony_cigrep '^#' $i | sed -e 's/^# //' > $T/qemu-cmd-settings
20562306a36Sopenharmony_ci. $T/qemu-cmd-settings
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_cigrep -v '^#' $T/scenarios.oldrun | awk '
20862306a36Sopenharmony_ci{
20962306a36Sopenharmony_ci	curbatch = "";
21062306a36Sopenharmony_ci	for (i = 2; i <= NF; i++)
21162306a36Sopenharmony_ci		curbatch = curbatch " " $i;
21262306a36Sopenharmony_ci	print "kvm-test-1-run-batch.sh" curbatch;
21362306a36Sopenharmony_ci}' > $T/runbatches.sh
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_ciif test -n "$dryrun"
21662306a36Sopenharmony_cithen
21762306a36Sopenharmony_ci	echo ---- Dryrun complete, directory: $rundir | tee -a "$rundir/log"
21862306a36Sopenharmony_cielse
21962306a36Sopenharmony_ci	( cd "$rundir"; sh $T/runbatches.sh ) | tee -a "$rundir/log"
22062306a36Sopenharmony_ci	kvm-end-run-stats.sh "$rundir" "$starttime"
22162306a36Sopenharmony_cifi
222