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