xref: /linux/tools/testing/selftests/rcutorture/bin/kvm-again.sh (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
17cf86c0bSPaul E. McKenney#!/bin/bash
27cf86c0bSPaul E. McKenney# SPDX-License-Identifier: GPL-2.0+
37cf86c0bSPaul E. McKenney#
47cf86c0bSPaul E. McKenney# Rerun a series of tests under KVM.
57cf86c0bSPaul E. McKenney#
67cf86c0bSPaul E. McKenney# Usage: kvm-again.sh /path/to/old/run [ options ]
77cf86c0bSPaul E. McKenney#
87cf86c0bSPaul E. McKenney# Copyright (C) 2021 Facebook, Inc.
97cf86c0bSPaul E. McKenney#
107cf86c0bSPaul E. McKenney# Authors: Paul E. McKenney <paulmck@kernel.org>
117cf86c0bSPaul E. McKenney
127cf86c0bSPaul E. McKenneyscriptname=$0
137cf86c0bSPaul E. McKenneyargs="$*"
147cf86c0bSPaul E. McKenney
15c211ae9cSPaul E. McKenneyT="`mktemp -d ${TMPDIR-/tmp}/kvm-again.sh.XXXXXX`"
167cf86c0bSPaul E. McKenneytrap 'rm -rf $T' 0
177cf86c0bSPaul E. McKenney
187cf86c0bSPaul E. McKenneyif ! test -d tools/testing/selftests/rcutorture/bin
197cf86c0bSPaul E. McKenneythen
207cf86c0bSPaul E. McKenney	echo $scriptname must be run from top-level directory of kernel source tree.
217cf86c0bSPaul E. McKenney	exit 1
227cf86c0bSPaul E. McKenneyfi
237cf86c0bSPaul E. McKenney
247cf86c0bSPaul E. McKenneyoldrun=$1
257cf86c0bSPaul E. McKenneyshift
267cf86c0bSPaul E. McKenneyif ! test -d "$oldrun"
277cf86c0bSPaul E. McKenneythen
287cf86c0bSPaul E. McKenney	echo "Usage: $scriptname /path/to/old/run [ options ]"
297cf86c0bSPaul E. McKenney	exit 1
307cf86c0bSPaul E. McKenneyfi
31fb4855c3SPaul E. McKenneyif ! cp "$oldrun/scenarios" $T/scenarios.oldrun
327cf86c0bSPaul E. McKenneythen
337cf86c0bSPaul E. McKenney	# Later on, can reconstitute this from console.log files.
347cf86c0bSPaul E. McKenney	echo Prior run batches file does not exist: $oldrun/batches
357cf86c0bSPaul E. McKenney	exit 1
367cf86c0bSPaul E. McKenneyfi
377cf86c0bSPaul E. McKenney
387cf86c0bSPaul E. McKenneyif test -f "$oldrun/torture_suite"
397cf86c0bSPaul E. McKenneythen
407cf86c0bSPaul E. McKenney	torture_suite="`cat $oldrun/torture_suite`"
417cf86c0bSPaul E. McKenneyelif test -f "$oldrun/TORTURE_SUITE"
427cf86c0bSPaul E. McKenneythen
437cf86c0bSPaul E. McKenney	torture_suite="`cat $oldrun/TORTURE_SUITE`"
447cf86c0bSPaul E. McKenneyelse
457cf86c0bSPaul E. McKenney	echo "Prior run torture_suite file does not exist: $oldrun/{torture_suite,TORTURE_SUITE}"
467cf86c0bSPaul E. McKenney	exit 1
477cf86c0bSPaul E. McKenneyfi
487cf86c0bSPaul E. McKenney
49a7d89cfbSPaul E. McKenneyRCUTORTURE="`pwd`/tools/testing/selftests/rcutorture"; export RCUTORTURE
50a7d89cfbSPaul E. McKenneyPATH=${RCUTORTURE}/bin:$PATH; export PATH
517cf86c0bSPaul E. McKenney. functions.sh
527cf86c0bSPaul E. McKenney
5350527f7cSPaul E. McKenneybootargs=
547cf86c0bSPaul E. McKenneydryrun=
5500505165SPaul E. McKenneydur=
567cf86c0bSPaul E. McKenneydefault_link="cp -R"
57fb53a8daSPaul E. McKenneyresdir="`pwd`/tools/testing/selftests/rcutorture/res"
58fb53a8daSPaul E. McKenneyrundir="$resdir/`date +%Y.%m.%d-%H.%M.%S-again`"
59fb53a8daSPaul E. McKenneygot_datestamp=
60fb53a8daSPaul E. McKenneygot_rundir=
617cf86c0bSPaul E. McKenney
627cf86c0bSPaul E. McKenneystartdate="`date`"
637cf86c0bSPaul E. McKenneystarttime="`get_starttime`"
647cf86c0bSPaul E. McKenney
657cf86c0bSPaul E. McKenneyusage () {
667cf86c0bSPaul E. McKenney	echo "Usage: $scriptname $oldrun [ arguments ]:"
6750527f7cSPaul E. McKenney	echo "       --bootargs kernel-boot-arguments"
68fb53a8daSPaul E. McKenney	echo "       --datestamp string"
697cf86c0bSPaul E. McKenney	echo "       --dryrun"
7000505165SPaul E. McKenney	echo "       --duration minutes | <seconds>s | <hours>h | <days>d"
717cf86c0bSPaul E. McKenney	echo "       --link hard|soft|copy"
727cf86c0bSPaul E. McKenney	echo "       --remote"
737cf86c0bSPaul E. McKenney	echo "       --rundir /new/res/path"
74fb53a8daSPaul E. McKenney	echo "Command line: $scriptname $args"
757cf86c0bSPaul E. McKenney	exit 1
767cf86c0bSPaul E. McKenney}
777cf86c0bSPaul E. McKenney
787cf86c0bSPaul E. McKenneywhile test $# -gt 0
797cf86c0bSPaul E. McKenneydo
807cf86c0bSPaul E. McKenney	case "$1" in
8150527f7cSPaul E. McKenney	--bootargs|--bootarg)
8250527f7cSPaul E. McKenney		checkarg --bootargs "(list of kernel boot arguments)" "$#" "$2" '.*' '^--'
8350527f7cSPaul E. McKenney		bootargs="$bootargs $2"
8450527f7cSPaul E. McKenney		shift
8550527f7cSPaul E. McKenney		;;
86fb53a8daSPaul E. McKenney	--datestamp)
87fb53a8daSPaul E. McKenney		checkarg --datestamp "(relative pathname)" "$#" "$2" '^[a-zA-Z0-9._/-]*$' '^--'
88fb53a8daSPaul E. McKenney		if test -n "$got_rundir" || test -n "$got_datestamp"
89fb53a8daSPaul E. McKenney		then
90fb53a8daSPaul E. McKenney			echo Only one of --datestamp or --rundir may be specified
91fb53a8daSPaul E. McKenney			usage
92fb53a8daSPaul E. McKenney		fi
93fb53a8daSPaul E. McKenney		got_datestamp=y
94fb53a8daSPaul E. McKenney		ds=$2
95fb53a8daSPaul E. McKenney		rundir="$resdir/$ds"
96fb53a8daSPaul E. McKenney		if test -e "$rundir"
97fb53a8daSPaul E. McKenney		then
98fb53a8daSPaul E. McKenney			echo "--datestamp $2: Already exists."
99fb53a8daSPaul E. McKenney			usage
100fb53a8daSPaul E. McKenney		fi
101fb53a8daSPaul E. McKenney		shift
102fb53a8daSPaul E. McKenney		;;
1037cf86c0bSPaul E. McKenney	--dryrun)
1047cf86c0bSPaul E. McKenney		dryrun=1
1057cf86c0bSPaul E. McKenney		;;
10600505165SPaul E. McKenney	--duration)
10700505165SPaul E. McKenney		checkarg --duration "(minutes)" $# "$2" '^[0-9][0-9]*\(s\|m\|h\|d\|\)$' '^error'
10800505165SPaul E. McKenney		mult=60
10900505165SPaul E. McKenney		if echo "$2" | grep -q 's$'
11000505165SPaul E. McKenney		then
11100505165SPaul E. McKenney			mult=1
11200505165SPaul E. McKenney		elif echo "$2" | grep -q 'h$'
11300505165SPaul E. McKenney		then
11400505165SPaul E. McKenney			mult=3600
11500505165SPaul E. McKenney		elif echo "$2" | grep -q 'd$'
11600505165SPaul E. McKenney		then
11700505165SPaul E. McKenney			mult=86400
11800505165SPaul E. McKenney		fi
11900505165SPaul E. McKenney		ts=`echo $2 | sed -e 's/[smhd]$//'`
12000505165SPaul E. McKenney		dur=$(($ts*mult))
12100505165SPaul E. McKenney		shift
12200505165SPaul E. McKenney		;;
1237cf86c0bSPaul E. McKenney	--link)
1247cf86c0bSPaul E. McKenney		checkarg --link "hard|soft|copy" "$#" "$2" 'hard\|soft\|copy' '^--'
1257cf86c0bSPaul E. McKenney		case "$2" in
1267cf86c0bSPaul E. McKenney		copy)
1277cf86c0bSPaul E. McKenney			arg_link="cp -R"
1287cf86c0bSPaul E. McKenney			;;
1297cf86c0bSPaul E. McKenney		hard)
1307cf86c0bSPaul E. McKenney			arg_link="cp -Rl"
1317cf86c0bSPaul E. McKenney			;;
1327cf86c0bSPaul E. McKenney		soft)
1337cf86c0bSPaul E. McKenney			arg_link="cp -Rs"
1347cf86c0bSPaul E. McKenney			;;
1357cf86c0bSPaul E. McKenney		esac
1367cf86c0bSPaul E. McKenney		shift
1377cf86c0bSPaul E. McKenney		;;
1387cf86c0bSPaul E. McKenney	--remote)
1397cf86c0bSPaul E. McKenney		arg_remote=1
1407cf86c0bSPaul E. McKenney		default_link="cp -as"
1417cf86c0bSPaul E. McKenney		;;
1427cf86c0bSPaul E. McKenney	--rundir)
1437cf86c0bSPaul E. McKenney		checkarg --rundir "(absolute pathname)" "$#" "$2" '^/' '^error'
144fb53a8daSPaul E. McKenney		if test -n "$got_rundir" || test -n "$got_datestamp"
145fb53a8daSPaul E. McKenney		then
146fb53a8daSPaul E. McKenney			echo Only one of --datestamp or --rundir may be specified
147fb53a8daSPaul E. McKenney			usage
148fb53a8daSPaul E. McKenney		fi
149fb53a8daSPaul E. McKenney		got_rundir=y
1507cf86c0bSPaul E. McKenney		rundir=$2
1517cf86c0bSPaul E. McKenney		if test -e "$rundir"
1527cf86c0bSPaul E. McKenney		then
1537cf86c0bSPaul E. McKenney			echo "--rundir $2: Already exists."
1547cf86c0bSPaul E. McKenney			usage
1557cf86c0bSPaul E. McKenney		fi
1567cf86c0bSPaul E. McKenney		shift
1577cf86c0bSPaul E. McKenney		;;
1587cf86c0bSPaul E. McKenney	*)
159fb53a8daSPaul E. McKenney		if test -n "$1"
160fb53a8daSPaul E. McKenney		then
1617cf86c0bSPaul E. McKenney			echo Unknown argument $1
1627cf86c0bSPaul E. McKenney			usage
163fb53a8daSPaul E. McKenney		fi
1647cf86c0bSPaul E. McKenney		;;
1657cf86c0bSPaul E. McKenney	esac
1667cf86c0bSPaul E. McKenney	shift
1677cf86c0bSPaul E. McKenneydone
1687cf86c0bSPaul E. McKenneyif test -z "$arg_link"
1697cf86c0bSPaul E. McKenneythen
1707cf86c0bSPaul E. McKenney	arg_link="$default_link"
1717cf86c0bSPaul E. McKenneyfi
1727cf86c0bSPaul E. McKenney
1737cf86c0bSPaul E. McKenneyecho ---- Re-run results directory: $rundir
1747cf86c0bSPaul E. McKenney
1757cf86c0bSPaul E. McKenney# Copy old run directory tree over and adjust.
1767cf86c0bSPaul E. McKenneymkdir -p "`dirname "$rundir"`"
1777cf86c0bSPaul E. McKenneyif ! $arg_link "$oldrun" "$rundir"
1787cf86c0bSPaul E. McKenneythen
1797cf86c0bSPaul E. McKenney	echo "Cannot copy from $oldrun to $rundir."
1807cf86c0bSPaul E. McKenney	usage
1817cf86c0bSPaul E. McKenneyfi
1829e528a84SPaul E. McKenneyrm -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
183ee8fef91SPaul E. McKenneytouch "$rundir/log"
184ee8fef91SPaul E. McKenneyecho $scriptname $args | tee -a "$rundir/log"
1857cf86c0bSPaul E. McKenneyecho $oldrun > "$rundir/re-run"
1867cf86c0bSPaul E. McKenneyif ! test -d "$rundir/../../bin"
1877cf86c0bSPaul E. McKenneythen
1887cf86c0bSPaul E. McKenney	$arg_link "$oldrun/../../bin" "$rundir/../.."
1897cf86c0bSPaul E. McKenneyfi
1907cf86c0bSPaul E. McKenneyfor i in $rundir/*/qemu-cmd
1917cf86c0bSPaul E. McKenneydo
1927cf86c0bSPaul E. McKenney	cp "$i" $T
1937cf86c0bSPaul E. McKenney	qemu_cmd_dir="`dirname "$i"`"
1947cf86c0bSPaul E. McKenney	kernel_dir="`echo $qemu_cmd_dir | sed -e 's/\.[0-9]\+$//'`"
195018629e9SPaul E. McKenney	jitter_dir="`dirname "$kernel_dir"`"
196*99549584SPaul E. McKenney	kvm-transform.sh "$kernel_dir/bzImage" "$qemu_cmd_dir/console.log" "$jitter_dir" "$dur" "$bootargs" < $T/qemu-cmd > $i
19703edf700SPaul E. McKenney	if test -n "$arg_remote"
19803edf700SPaul E. McKenney	then
1997cf86c0bSPaul E. McKenney		echo "# TORTURE_KCONFIG_GDB_ARG=''" >> $i
20003edf700SPaul E. McKenney	fi
2017cf86c0bSPaul E. McKenneydone
202a5dbe252SPaul E. McKenney
203a5dbe252SPaul E. McKenney# Extract settings from the last qemu-cmd file transformed above.
204a5dbe252SPaul E. McKenneygrep '^#' $i | sed -e 's/^# //' > $T/qemu-cmd-settings
205a5dbe252SPaul E. McKenney. $T/qemu-cmd-settings
206a5dbe252SPaul E. McKenney
207fb4855c3SPaul E. McKenneygrep -v '^#' $T/scenarios.oldrun | awk '
2087cf86c0bSPaul E. McKenney{
2097cf86c0bSPaul E. McKenney	curbatch = "";
210fb4855c3SPaul E. McKenney	for (i = 2; i <= NF; i++)
211fb4855c3SPaul E. McKenney		curbatch = curbatch " " $i;
212fb4855c3SPaul E. McKenney	print "kvm-test-1-run-batch.sh" curbatch;
2137cf86c0bSPaul E. McKenney}' > $T/runbatches.sh
2147cf86c0bSPaul E. McKenney
2157cf86c0bSPaul E. McKenneyif test -n "$dryrun"
2167cf86c0bSPaul E. McKenneythen
2177cf86c0bSPaul E. McKenney	echo ---- Dryrun complete, directory: $rundir | tee -a "$rundir/log"
2187cf86c0bSPaul E. McKenneyelse
219a5202e17SPaul E. McKenney	( cd "$rundir"; sh $T/runbatches.sh ) | tee -a "$rundir/log"
220ee8fef91SPaul E. McKenney	kvm-end-run-stats.sh "$rundir" "$starttime"
2217cf86c0bSPaul E. McKenneyfi
222