cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

kvm-again.sh (4046B)


      1#!/bin/bash
      2# SPDX-License-Identifier: GPL-2.0+
      3#
      4# Rerun a series of tests under KVM.
      5#
      6# Usage: kvm-again.sh /path/to/old/run [ options ]
      7#
      8# Copyright (C) 2021 Facebook, Inc.
      9#
     10# Authors: Paul E. McKenney <paulmck@kernel.org>
     11
     12scriptname=$0
     13args="$*"
     14
     15T=${TMPDIR-/tmp}/kvm-again.sh.$$
     16trap 'rm -rf $T' 0
     17mkdir $T
     18
     19if ! test -d tools/testing/selftests/rcutorture/bin
     20then
     21	echo $scriptname must be run from top-level directory of kernel source tree.
     22	exit 1
     23fi
     24
     25oldrun=$1
     26shift
     27if ! test -d "$oldrun"
     28then
     29	echo "Usage: $scriptname /path/to/old/run [ options ]"
     30	exit 1
     31fi
     32if ! cp "$oldrun/scenarios" $T/scenarios.oldrun
     33then
     34	# Later on, can reconstitute this from console.log files.
     35	echo Prior run batches file does not exist: $oldrun/batches
     36	exit 1
     37fi
     38
     39if test -f "$oldrun/torture_suite"
     40then
     41	torture_suite="`cat $oldrun/torture_suite`"
     42elif test -f "$oldrun/TORTURE_SUITE"
     43then
     44	torture_suite="`cat $oldrun/TORTURE_SUITE`"
     45else
     46	echo "Prior run torture_suite file does not exist: $oldrun/{torture_suite,TORTURE_SUITE}"
     47	exit 1
     48fi
     49
     50RCUTORTURE="`pwd`/tools/testing/selftests/rcutorture"; export RCUTORTURE
     51PATH=${RCUTORTURE}/bin:$PATH; export PATH
     52. functions.sh
     53
     54dryrun=
     55dur=
     56default_link="cp -R"
     57rundir="`pwd`/tools/testing/selftests/rcutorture/res/`date +%Y.%m.%d-%H.%M.%S-again`"
     58
     59startdate="`date`"
     60starttime="`get_starttime`"
     61
     62usage () {
     63	echo "Usage: $scriptname $oldrun [ arguments ]:"
     64	echo "       --dryrun"
     65	echo "       --duration minutes | <seconds>s | <hours>h | <days>d"
     66	echo "       --link hard|soft|copy"
     67	echo "       --remote"
     68	echo "       --rundir /new/res/path"
     69	exit 1
     70}
     71
     72while test $# -gt 0
     73do
     74	case "$1" in
     75	--dryrun)
     76		dryrun=1
     77		;;
     78	--duration)
     79		checkarg --duration "(minutes)" $# "$2" '^[0-9][0-9]*\(s\|m\|h\|d\|\)$' '^error'
     80		mult=60
     81		if echo "$2" | grep -q 's$'
     82		then
     83			mult=1
     84		elif echo "$2" | grep -q 'h$'
     85		then
     86			mult=3600
     87		elif echo "$2" | grep -q 'd$'
     88		then
     89			mult=86400
     90		fi
     91		ts=`echo $2 | sed -e 's/[smhd]$//'`
     92		dur=$(($ts*mult))
     93		shift
     94		;;
     95	--link)
     96		checkarg --link "hard|soft|copy" "$#" "$2" 'hard\|soft\|copy' '^--'
     97		case "$2" in
     98		copy)
     99			arg_link="cp -R"
    100			;;
    101		hard)
    102			arg_link="cp -Rl"
    103			;;
    104		soft)
    105			arg_link="cp -Rs"
    106			;;
    107		esac
    108		shift
    109		;;
    110	--remote)
    111		arg_remote=1
    112		default_link="cp -as"
    113		;;
    114	--rundir)
    115		checkarg --rundir "(absolute pathname)" "$#" "$2" '^/' '^error'
    116		rundir=$2
    117		if test -e "$rundir"
    118		then
    119			echo "--rundir $2: Already exists."
    120			usage
    121		fi
    122		shift
    123		;;
    124	*)
    125		echo Unknown argument $1
    126		usage
    127		;;
    128	esac
    129	shift
    130done
    131if test -z "$arg_link"
    132then
    133	arg_link="$default_link"
    134fi
    135
    136echo ---- Re-run results directory: $rundir
    137
    138# Copy old run directory tree over and adjust.
    139mkdir -p "`dirname "$rundir"`"
    140if ! $arg_link "$oldrun" "$rundir"
    141then
    142	echo "Cannot copy from $oldrun to $rundir."
    143	usage
    144fi
    145rm -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
    146touch "$rundir/log"
    147echo $scriptname $args | tee -a "$rundir/log"
    148echo $oldrun > "$rundir/re-run"
    149if ! test -d "$rundir/../../bin"
    150then
    151	$arg_link "$oldrun/../../bin" "$rundir/../.."
    152fi
    153for i in $rundir/*/qemu-cmd
    154do
    155	cp "$i" $T
    156	qemu_cmd_dir="`dirname "$i"`"
    157	kernel_dir="`echo $qemu_cmd_dir | sed -e 's/\.[0-9]\+$//'`"
    158	jitter_dir="`dirname "$kernel_dir"`"
    159	kvm-transform.sh "$kernel_dir/bzImage" "$qemu_cmd_dir/console.log" "$jitter_dir" $dur < $T/qemu-cmd > $i
    160	if test -n "$arg_remote"
    161	then
    162		echo "# TORTURE_KCONFIG_GDB_ARG=''" >> $i
    163	fi
    164done
    165
    166# Extract settings from the last qemu-cmd file transformed above.
    167grep '^#' $i | sed -e 's/^# //' > $T/qemu-cmd-settings
    168. $T/qemu-cmd-settings
    169
    170grep -v '^#' $T/scenarios.oldrun | awk '
    171{
    172	curbatch = "";
    173	for (i = 2; i <= NF; i++)
    174		curbatch = curbatch " " $i;
    175	print "kvm-test-1-run-batch.sh" curbatch;
    176}' > $T/runbatches.sh
    177
    178if test -n "$dryrun"
    179then
    180	echo ---- Dryrun complete, directory: $rundir | tee -a "$rundir/log"
    181else
    182	( cd "$rundir"; sh $T/runbatches.sh ) | tee -a "$rundir/log"
    183	kvm-end-run-stats.sh "$rundir" "$starttime"
    184fi