222 lines
4.8 KiB
Bash
222 lines
4.8 KiB
Bash
|
#!/bin/bash
|
||
|
# SPDX-License-Identifier: GPL-2.0+
|
||
|
#
|
||
|
# Rerun a series of tests under KVM.
|
||
|
#
|
||
|
# Usage: kvm-again.sh /path/to/old/run [ options ]
|
||
|
#
|
||
|
# Copyright (C) 2021 Facebook, Inc.
|
||
|
#
|
||
|
# Authors: Paul E. McKenney <paulmck@kernel.org>
|
||
|
|
||
|
scriptname=$0
|
||
|
args="$*"
|
||
|
|
||
|
T="`mktemp -d ${TMPDIR-/tmp}/kvm-again.sh.XXXXXX`"
|
||
|
trap 'rm -rf $T' 0
|
||
|
|
||
|
if ! test -d tools/testing/selftests/rcutorture/bin
|
||
|
then
|
||
|
echo $scriptname must be run from top-level directory of kernel source tree.
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
oldrun=$1
|
||
|
shift
|
||
|
if ! test -d "$oldrun"
|
||
|
then
|
||
|
echo "Usage: $scriptname /path/to/old/run [ options ]"
|
||
|
exit 1
|
||
|
fi
|
||
|
if ! cp "$oldrun/scenarios" $T/scenarios.oldrun
|
||
|
then
|
||
|
# Later on, can reconstitute this from console.log files.
|
||
|
echo Prior run batches file does not exist: $oldrun/batches
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
if test -f "$oldrun/torture_suite"
|
||
|
then
|
||
|
torture_suite="`cat $oldrun/torture_suite`"
|
||
|
elif test -f "$oldrun/TORTURE_SUITE"
|
||
|
then
|
||
|
torture_suite="`cat $oldrun/TORTURE_SUITE`"
|
||
|
else
|
||
|
echo "Prior run torture_suite file does not exist: $oldrun/{torture_suite,TORTURE_SUITE}"
|
||
|
exit 1
|
||
|
fi
|
||
|
|
||
|
RCUTORTURE="`pwd`/tools/testing/selftests/rcutorture"; export RCUTORTURE
|
||
|
PATH=${RCUTORTURE}/bin:$PATH; export PATH
|
||
|
. functions.sh
|
||
|
|
||
|
bootargs=
|
||
|
dryrun=
|
||
|
dur=
|
||
|
default_link="cp -R"
|
||
|
resdir="`pwd`/tools/testing/selftests/rcutorture/res"
|
||
|
rundir="$resdir/`date +%Y.%m.%d-%H.%M.%S-again`"
|
||
|
got_datestamp=
|
||
|
got_rundir=
|
||
|
|
||
|
startdate="`date`"
|
||
|
starttime="`get_starttime`"
|
||
|
|
||
|
usage () {
|
||
|
echo "Usage: $scriptname $oldrun [ arguments ]:"
|
||
|
echo " --bootargs kernel-boot-arguments"
|
||
|
echo " --datestamp string"
|
||
|
echo " --dryrun"
|
||
|
echo " --duration minutes | <seconds>s | <hours>h | <days>d"
|
||
|
echo " --link hard|soft|copy"
|
||
|
echo " --remote"
|
||
|
echo " --rundir /new/res/path"
|
||
|
echo "Command line: $scriptname $args"
|
||
|
exit 1
|
||
|
}
|
||
|
|
||
|
while test $# -gt 0
|
||
|
do
|
||
|
case "$1" in
|
||
|
--bootargs|--bootarg)
|
||
|
checkarg --bootargs "(list of kernel boot arguments)" "$#" "$2" '.*' '^--'
|
||
|
bootargs="$bootargs $2"
|
||
|
shift
|
||
|
;;
|
||
|
--datestamp)
|
||
|
checkarg --datestamp "(relative pathname)" "$#" "$2" '^[a-zA-Z0-9._/-]*$' '^--'
|
||
|
if test -n "$got_rundir" || test -n "$got_datestamp"
|
||
|
then
|
||
|
echo Only one of --datestamp or --rundir may be specified
|
||
|
usage
|
||
|
fi
|
||
|
got_datestamp=y
|
||
|
ds=$2
|
||
|
rundir="$resdir/$ds"
|
||
|
if test -e "$rundir"
|
||
|
then
|
||
|
echo "--datestamp $2: Already exists."
|
||
|
usage
|
||
|
fi
|
||
|
shift
|
||
|
;;
|
||
|
--dryrun)
|
||
|
dryrun=1
|
||
|
;;
|
||
|
--duration)
|
||
|
checkarg --duration "(minutes)" $# "$2" '^[0-9][0-9]*\(s\|m\|h\|d\|\)$' '^error'
|
||
|
mult=60
|
||
|
if echo "$2" | grep -q 's$'
|
||
|
then
|
||
|
mult=1
|
||
|
elif echo "$2" | grep -q 'h$'
|
||
|
then
|
||
|
mult=3600
|
||
|
elif echo "$2" | grep -q 'd$'
|
||
|
then
|
||
|
mult=86400
|
||
|
fi
|
||
|
ts=`echo $2 | sed -e 's/[smhd]$//'`
|
||
|
dur=$(($ts*mult))
|
||
|
shift
|
||
|
;;
|
||
|
--link)
|
||
|
checkarg --link "hard|soft|copy" "$#" "$2" 'hard\|soft\|copy' '^--'
|
||
|
case "$2" in
|
||
|
copy)
|
||
|
arg_link="cp -R"
|
||
|
;;
|
||
|
hard)
|
||
|
arg_link="cp -Rl"
|
||
|
;;
|
||
|
soft)
|
||
|
arg_link="cp -Rs"
|
||
|
;;
|
||
|
esac
|
||
|
shift
|
||
|
;;
|
||
|
--remote)
|
||
|
arg_remote=1
|
||
|
default_link="cp -as"
|
||
|
;;
|
||
|
--rundir)
|
||
|
checkarg --rundir "(absolute pathname)" "$#" "$2" '^/' '^error'
|
||
|
if test -n "$got_rundir" || test -n "$got_datestamp"
|
||
|
then
|
||
|
echo Only one of --datestamp or --rundir may be specified
|
||
|
usage
|
||
|
fi
|
||
|
got_rundir=y
|
||
|
rundir=$2
|
||
|
if test -e "$rundir"
|
||
|
then
|
||
|
echo "--rundir $2: Already exists."
|
||
|
usage
|
||
|
fi
|
||
|
shift
|
||
|
;;
|
||
|
*)
|
||
|
if test -n "$1"
|
||
|
then
|
||
|
echo Unknown argument $1
|
||
|
usage
|
||
|
fi
|
||
|
;;
|
||
|
esac
|
||
|
shift
|
||
|
done
|
||
|
if test -z "$arg_link"
|
||
|
then
|
||
|
arg_link="$default_link"
|
||
|
fi
|
||
|
|
||
|
echo ---- Re-run results directory: $rundir
|
||
|
|
||
|
# Copy old run directory tree over and adjust.
|
||
|
mkdir -p "`dirname "$rundir"`"
|
||
|
if ! $arg_link "$oldrun" "$rundir"
|
||
|
then
|
||
|
echo "Cannot copy from $oldrun to $rundir."
|
||
|
usage
|
||
|
fi
|
||
|
rm -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
|
||
|
touch "$rundir/log"
|
||
|
echo $scriptname $args | tee -a "$rundir/log"
|
||
|
echo $oldrun > "$rundir/re-run"
|
||
|
if ! test -d "$rundir/../../bin"
|
||
|
then
|
||
|
$arg_link "$oldrun/../../bin" "$rundir/../.."
|
||
|
fi
|
||
|
for i in $rundir/*/qemu-cmd
|
||
|
do
|
||
|
cp "$i" $T
|
||
|
qemu_cmd_dir="`dirname "$i"`"
|
||
|
kernel_dir="`echo $qemu_cmd_dir | sed -e 's/\.[0-9]\+$//'`"
|
||
|
jitter_dir="`dirname "$kernel_dir"`"
|
||
|
kvm-transform.sh "$kernel_dir/bzImage" "$qemu_cmd_dir/console.log" "$jitter_dir" $dur "$bootargs" < $T/qemu-cmd > $i
|
||
|
if test -n "$arg_remote"
|
||
|
then
|
||
|
echo "# TORTURE_KCONFIG_GDB_ARG=''" >> $i
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
# Extract settings from the last qemu-cmd file transformed above.
|
||
|
grep '^#' $i | sed -e 's/^# //' > $T/qemu-cmd-settings
|
||
|
. $T/qemu-cmd-settings
|
||
|
|
||
|
grep -v '^#' $T/scenarios.oldrun | awk '
|
||
|
{
|
||
|
curbatch = "";
|
||
|
for (i = 2; i <= NF; i++)
|
||
|
curbatch = curbatch " " $i;
|
||
|
print "kvm-test-1-run-batch.sh" curbatch;
|
||
|
}' > $T/runbatches.sh
|
||
|
|
||
|
if test -n "$dryrun"
|
||
|
then
|
||
|
echo ---- Dryrun complete, directory: $rundir | tee -a "$rundir/log"
|
||
|
else
|
||
|
( cd "$rundir"; sh $T/runbatches.sh ) | tee -a "$rundir/log"
|
||
|
kvm-end-run-stats.sh "$rundir" "$starttime"
|
||
|
fi
|