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