From: "Paul E. McKenney" <paul...@kernel.org>

Currently, kvm-test-1-run.sh both builds and runs an rcutorture kernel,
which is inconvenient when it is necessary to re-run an old run or to
carry out a run on a remote system.  This commit therefore extracts the
portion of kvm-test-1-run.sh that invoke qemu to actually run rcutorture
and places it in kvm-test-1-run-qemu.sh.

Signed-off-by: Paul E. McKenney <paul...@kernel.org>
---
 .../rcutorture/bin/kvm-test-1-run-qemu.sh          | 170 +++++++++++++++++++++
 .../selftests/rcutorture/bin/kvm-test-1-run.sh     | 127 +--------------
 2 files changed, 171 insertions(+), 126 deletions(-)
 create mode 100755 
tools/testing/selftests/rcutorture/bin/kvm-test-1-run-qemu.sh

diff --git a/tools/testing/selftests/rcutorture/bin/kvm-test-1-run-qemu.sh 
b/tools/testing/selftests/rcutorture/bin/kvm-test-1-run-qemu.sh
new file mode 100755
index 0000000..6b0d71b
--- /dev/null
+++ b/tools/testing/selftests/rcutorture/bin/kvm-test-1-run-qemu.sh
@@ -0,0 +1,170 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0+
+#
+# Carry out a kvm-based run for the specified qemu-cmd file, which might
+# have been generated by --build-only kvm.sh run.
+#
+# Usage: kvm-test-1-run-qemu.sh qemu-cmd-dir
+#
+# qemu-cmd-dir provides the directory containing qemu-cmd file.
+#      This is assumed to be of the form prefix/ds/scenario, where
+#      "ds" is the top-level date-stamped directory and "scenario"
+#      is the scenario name.  Any required adjustments to this file
+#      must have been made by the caller.  The shell-command comments
+#      at the end of the qemu-cmd file are not optional.
+#
+# Copyright (C) 2021 Facebook, Inc.
+#
+# Authors: Paul E. McKenney <paul...@kernel.org>
+
+T=${TMPDIR-/tmp}/kvm-test-1-run-qemu.sh.$$
+trap 'rm -rf $T' 0
+mkdir $T
+
+resdir="$1"
+if ! test -d "$resdir"
+then
+       echo $0: Nonexistent directory: $resdir
+       exit 1
+fi
+if ! test -f "$resdir/qemu-cmd"
+then
+       echo $0: Nonexistent qemu-cmd file: $resdir/qemu-cmd
+       exit 1
+fi
+
+# Obtain settings from the qemu-cmd file.
+grep '^#' $resdir/qemu-cmd | sed -e 's/^# //' > $T/qemu-cmd-settings
+. $T/qemu-cmd-settings
+
+# Decorate qemu-cmd with redirection, backgrounding, and PID capture
+sed -e 's/$/ 2>\&1 \&/' < $resdir/qemu-cmd > $T/qemu-cmd
+echo 'echo $! > $resdir/qemu_pid' >> $T/qemu-cmd
+
+# In case qemu refuses to run...
+echo "NOTE: $QEMU either did not run or was interactive" > $resdir/console.log
+
+# Attempt to run qemu
+kstarttime=`gawk 'BEGIN { print systime() }' < /dev/null`
+( . $T/qemu-cmd; wait `cat  $resdir/qemu_pid`; echo $? > $resdir/qemu-retval ) 
&
+commandcompleted=0
+if test -z "$TORTURE_KCONFIG_GDB_ARG"
+then
+       sleep 10 # Give qemu's pid a chance to reach the file
+       if test -s "$resdir/qemu_pid"
+       then
+               qemu_pid=`cat "$resdir/qemu_pid"`
+               echo Monitoring qemu job at pid $qemu_pid
+       else
+               qemu_pid=""
+               echo Monitoring qemu job at yet-as-unknown pid
+       fi
+fi
+if test -n "$TORTURE_KCONFIG_GDB_ARG"
+then
+       base_resdir=`echo $resdir | sed -e 's/\.[0-9]\+$//'`
+       if ! test -f $base_resdir/vmlinux
+       then
+               base_resdir=/path/to
+       fi
+       echo Waiting for you to attach a debug session, for example: > /dev/tty
+       echo "    gdb $base_resdir/vmlinux" > /dev/tty
+       echo 'After symbols load and the "(gdb)" prompt appears:' > /dev/tty
+       echo "    target remote :1234" > /dev/tty
+       echo "    continue" > /dev/tty
+       kstarttime=`gawk 'BEGIN { print systime() }' < /dev/null`
+fi
+while :
+do
+       if test -z "$qemu_pid" -a -s "$resdir/qemu_pid"
+       then
+               qemu_pid=`cat "$resdir/qemu_pid"`
+       fi
+       kruntime=`gawk 'BEGIN { print systime() - '"$kstarttime"' }' < 
/dev/null`
+       if test -z "$qemu_pid" || kill -0 "$qemu_pid" > /dev/null 2>&1
+       then
+               if test -n "$TORTURE_KCONFIG_GDB_ARG"
+               then
+                       :
+               elif test $kruntime -ge $seconds || test -f "$resdir/../STOP.1"
+               then
+                       break;
+               fi
+               sleep 1
+       else
+               commandcompleted=1
+               if test $kruntime -lt $seconds
+               then
+                       echo Completed in $kruntime vs. $seconds >> 
$resdir/Warnings 2>&1
+                       grep "^(qemu) qemu:" $resdir/kvm-test-1-run.sh.out >> 
$resdir/Warnings 2>&1
+                       killpid="`sed -n "s/^(qemu) qemu: terminating on signal 
[0-9]* from pid \([0-9]*\).*$/\1/p" $resdir/Warnings`"
+                       if test -n "$killpid"
+                       then
+                               echo "ps -fp $killpid" >> $resdir/Warnings 2>&1
+                               ps -fp $killpid >> $resdir/Warnings 2>&1
+                       fi
+               else
+                       echo ' ---' `date`: "Kernel done"
+               fi
+               break
+       fi
+done
+if test -z "$qemu_pid" -a -s "$resdir/qemu_pid"
+then
+       qemu_pid=`cat "$resdir/qemu_pid"`
+fi
+if test $commandcompleted -eq 0 -a -n "$qemu_pid"
+then
+       if ! test -f "$resdir/../STOP.1"
+       then
+               echo Grace period for qemu job at pid $qemu_pid
+       fi
+       oldline="`tail $resdir/console.log`"
+       while :
+       do
+               if test -f "$resdir/../STOP.1"
+               then
+                       echo "PID $qemu_pid killed due to run STOP.1 request" 
>> $resdir/Warnings 2>&1
+                       kill -KILL $qemu_pid
+                       break
+               fi
+               kruntime=`gawk 'BEGIN { print systime() - '"$kstarttime"' }' < 
/dev/null`
+               if kill -0 $qemu_pid > /dev/null 2>&1
+               then
+                       :
+               else
+                       break
+               fi
+               must_continue=no
+               newline="`tail $resdir/console.log`"
+               if test "$newline" != "$oldline" && echo $newline | grep -q ' 
[0-9]\+us : '
+               then
+                       must_continue=yes
+               fi
+               last_ts="`tail $resdir/console.log | grep '^\[ 
*[0-9]\+\.[0-9]\+]' | tail -1 | sed -e 's/^\[ *//' -e 's/\..*$//'`"
+               if test -z "$last_ts"
+               then
+                       last_ts=0
+               fi
+               if test "$newline" != "$oldline" -a "$last_ts" -lt $((seconds + 
$TORTURE_SHUTDOWN_GRACE))
+               then
+                       must_continue=yes
+               fi
+               if test $must_continue = no -a $kruntime -ge $((seconds + 
$TORTURE_SHUTDOWN_GRACE))
+               then
+                       echo "!!! PID $qemu_pid hung at $kruntime vs. $seconds 
seconds" >> $resdir/Warnings 2>&1
+                       kill -KILL $qemu_pid
+                       break
+               fi
+               oldline=$newline
+               sleep 10
+       done
+elif test -z "$qemu_pid"
+then
+       echo Unknown PID, cannot kill qemu command
+fi
+
+# Tell the script that this run is done.
+rm -f $resdir/build.run
+
+parse-console.sh $resdir/console.log $title
diff --git a/tools/testing/selftests/rcutorture/bin/kvm-test-1-run.sh 
b/tools/testing/selftests/rcutorture/bin/kvm-test-1-run.sh
index 5d9ac90..f3d2ded 100755
--- a/tools/testing/selftests/rcutorture/bin/kvm-test-1-run.sh
+++ b/tools/testing/selftests/rcutorture/bin/kvm-test-1-run.sh
@@ -210,129 +210,4 @@ then
        exit 0
 fi
 
-# Decorate qemu-cmd with redirection, backgrounding, and PID capture
-sed -e 's/$/ 2>\&1 \&/' < $resdir/qemu-cmd > $T/qemu-cmd
-echo 'echo $! > $resdir/qemu_pid' >> $T/qemu-cmd
-
-# In case qemu refuses to run...
-echo "NOTE: $QEMU either did not run or was interactive" > $resdir/console.log
-
-# Attempt to run qemu
-kstarttime=`gawk 'BEGIN { print systime() }' < /dev/null`
-( . $T/qemu-cmd; wait `cat  $resdir/qemu_pid`; echo $? > $resdir/qemu-retval ) 
&
-commandcompleted=0
-if test -z "$TORTURE_KCONFIG_GDB_ARG"
-then
-       sleep 10 # Give qemu's pid a chance to reach the file
-       if test -s "$resdir/qemu_pid"
-       then
-               qemu_pid=`cat "$resdir/qemu_pid"`
-               echo Monitoring qemu job at pid $qemu_pid
-       else
-               qemu_pid=""
-               echo Monitoring qemu job at yet-as-unknown pid
-       fi
-fi
-if test -n "$TORTURE_KCONFIG_GDB_ARG"
-then
-       echo Waiting for you to attach a debug session, for example: > /dev/tty
-       echo "    gdb $base_resdir/vmlinux" > /dev/tty
-       echo 'After symbols load and the "(gdb)" prompt appears:' > /dev/tty
-       echo "    target remote :1234" > /dev/tty
-       echo "    continue" > /dev/tty
-       kstarttime=`gawk 'BEGIN { print systime() }' < /dev/null`
-fi
-while :
-do
-       if test -z "$qemu_pid" -a -s "$resdir/qemu_pid"
-       then
-               qemu_pid=`cat "$resdir/qemu_pid"`
-       fi
-       kruntime=`gawk 'BEGIN { print systime() - '"$kstarttime"' }' < 
/dev/null`
-       if test -z "$qemu_pid" || kill -0 "$qemu_pid" > /dev/null 2>&1
-       then
-               if test -n "$TORTURE_KCONFIG_GDB_ARG"
-               then
-                       :
-               elif test $kruntime -ge $seconds || test -f "$resdir/../STOP.1"
-               then
-                       break;
-               fi
-               sleep 1
-       else
-               commandcompleted=1
-               if test $kruntime -lt $seconds
-               then
-                       echo Completed in $kruntime vs. $seconds >> 
$resdir/Warnings 2>&1
-                       grep "^(qemu) qemu:" $resdir/kvm-test-1-run.sh.out >> 
$resdir/Warnings 2>&1
-                       killpid="`sed -n "s/^(qemu) qemu: terminating on signal 
[0-9]* from pid \([0-9]*\).*$/\1/p" $resdir/Warnings`"
-                       if test -n "$killpid"
-                       then
-                               echo "ps -fp $killpid" >> $resdir/Warnings 2>&1
-                               ps -fp $killpid >> $resdir/Warnings 2>&1
-                       fi
-               else
-                       echo ' ---' `date`: "Kernel done"
-               fi
-               break
-       fi
-done
-if test -z "$qemu_pid" -a -s "$resdir/qemu_pid"
-then
-       qemu_pid=`cat "$resdir/qemu_pid"`
-fi
-if test $commandcompleted -eq 0 -a -n "$qemu_pid"
-then
-       if ! test -f "$resdir/../STOP.1"
-       then
-               echo Grace period for qemu job at pid $qemu_pid
-       fi
-       oldline="`tail $resdir/console.log`"
-       while :
-       do
-               if test -f "$resdir/../STOP.1"
-               then
-                       echo "PID $qemu_pid killed due to run STOP.1 request" 
>> $resdir/Warnings 2>&1
-                       kill -KILL $qemu_pid
-                       break
-               fi
-               kruntime=`gawk 'BEGIN { print systime() - '"$kstarttime"' }' < 
/dev/null`
-               if kill -0 $qemu_pid > /dev/null 2>&1
-               then
-                       :
-               else
-                       break
-               fi
-               must_continue=no
-               newline="`tail $resdir/console.log`"
-               if test "$newline" != "$oldline" && echo $newline | grep -q ' 
[0-9]\+us : '
-               then
-                       must_continue=yes
-               fi
-               last_ts="`tail $resdir/console.log | grep '^\[ 
*[0-9]\+\.[0-9]\+]' | tail -1 | sed -e 's/^\[ *//' -e 's/\..*$//'`"
-               if test -z "$last_ts"
-               then
-                       last_ts=0
-               fi
-               if test "$newline" != "$oldline" -a "$last_ts" -lt $((seconds + 
$TORTURE_SHUTDOWN_GRACE))
-               then
-                       must_continue=yes
-               fi
-               if test $must_continue = no -a $kruntime -ge $((seconds + 
$TORTURE_SHUTDOWN_GRACE))
-               then
-                       echo "!!! PID $qemu_pid hung at $kruntime vs. $seconds 
seconds" >> $resdir/Warnings 2>&1
-                       kill -KILL $qemu_pid
-                       break
-               fi
-               oldline=$newline
-               sleep 10
-       done
-elif test -z "$qemu_pid"
-then
-       echo Unknown PID, cannot kill qemu command
-fi
-
-# Tell the script that this run is done.
-rm -f $resdir/build.run
-
-parse-console.sh $resdir/console.log $title
+kvm-test-1-run-qemu.sh $resdir
-- 
2.9.5

Reply via email to