2013-09-28 15:12:21 -06:00
|
|
|
#!/bin/bash
|
2019-02-11 08:14:09 -07:00
|
|
|
# SPDX-License-Identifier: GPL-2.0+
|
2013-09-28 15:12:21 -06:00
|
|
|
#
|
|
|
|
# Run a kvm-based test of the specified tree on the specified configs.
|
|
|
|
# Fully automated run and error checking, no graphics console.
|
|
|
|
#
|
|
|
|
# Execute this in the source tree. Do not run it as a background task
|
|
|
|
# because qemu does not seem to like that much.
|
|
|
|
#
|
2016-03-29 11:50:38 -06:00
|
|
|
# Usage: kvm-test-1-run.sh config builddir resdir seconds qemu-args boot_args
|
2013-09-28 15:12:21 -06:00
|
|
|
#
|
2016-05-18 21:42:23 -06:00
|
|
|
# qemu-args defaults to "-enable-kvm -nographic", along with arguments
|
|
|
|
# specifying the number of CPUs and other options
|
|
|
|
# generated from the underlying CPU architecture.
|
2014-02-06 21:35:41 -07:00
|
|
|
# boot_args defaults to value returned by the per_version_boot_params
|
|
|
|
# shell function.
|
2013-09-28 15:12:21 -06:00
|
|
|
#
|
2014-01-13 23:57:48 -07:00
|
|
|
# Anything you specify for either qemu-args or boot_args is appended to
|
2013-09-28 15:12:21 -06:00
|
|
|
# the default values. The "-smp" value is deduced from the contents of
|
|
|
|
# the config fragment.
|
|
|
|
#
|
|
|
|
# More sophisticated argument parsing is clearly needed.
|
|
|
|
#
|
|
|
|
# Copyright (C) IBM Corporation, 2011
|
|
|
|
#
|
2019-02-11 08:14:09 -07:00
|
|
|
# Authors: Paul E. McKenney <paulmck@linux.ibm.com>
|
2013-09-28 15:12:21 -06:00
|
|
|
|
2017-08-30 16:33:49 -06:00
|
|
|
T=${TMPDIR-/tmp}/kvm-test-1-run.sh.$$
|
2013-09-28 15:12:21 -06:00
|
|
|
trap 'rm -rf $T' 0
|
2017-05-01 18:49:29 -06:00
|
|
|
mkdir $T
|
2013-09-28 15:12:21 -06:00
|
|
|
|
2017-11-03 04:17:28 -06:00
|
|
|
. functions.sh
|
2014-10-04 11:04:15 -06:00
|
|
|
. $CONFIGFRAG/ver_functions.sh
|
2013-09-28 15:12:21 -06:00
|
|
|
|
|
|
|
config_template=${1}
|
2014-02-06 12:54:32 -07:00
|
|
|
config_dir=`echo $config_template | sed -e 's,/[^/]*$,,'`
|
2013-09-28 15:12:21 -06:00
|
|
|
title=`echo $config_template | sed -e 's/^.*\///'`
|
|
|
|
builddir=${2}
|
|
|
|
resdir=${3}
|
|
|
|
if test -z "$resdir" -o ! -d "$resdir" -o ! -w "$resdir"
|
|
|
|
then
|
2014-02-06 21:35:41 -07:00
|
|
|
echo "kvm-test-1-run.sh :$resdir: Not a writable directory, cannot store results into it"
|
2013-09-28 15:12:21 -06:00
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
echo ' ---' `date`: Starting build
|
2013-09-30 15:49:43 -06:00
|
|
|
echo ' ---' Kconfig fragment at: $config_template >> $resdir/log
|
2017-05-01 18:49:29 -06:00
|
|
|
touch $resdir/ConfigFragment.input $resdir/ConfigFragment
|
2014-02-06 12:54:32 -07:00
|
|
|
if test -r "$config_dir/CFcommon"
|
|
|
|
then
|
2017-05-01 18:49:29 -06:00
|
|
|
echo " --- $config_dir/CFcommon" >> $resdir/ConfigFragment.input
|
|
|
|
cat < $config_dir/CFcommon >> $resdir/ConfigFragment.input
|
|
|
|
config_override.sh $config_dir/CFcommon $config_template > $T/Kc1
|
|
|
|
grep '#CHECK#' $config_dir/CFcommon >> $resdir/ConfigFragment
|
|
|
|
else
|
|
|
|
cp $config_template $T/Kc1
|
2014-02-06 12:54:32 -07:00
|
|
|
fi
|
2017-05-01 18:49:29 -06:00
|
|
|
echo " --- $config_template" >> $resdir/ConfigFragment.input
|
|
|
|
cat $config_template >> $resdir/ConfigFragment.input
|
|
|
|
grep '#CHECK#' $config_template >> $resdir/ConfigFragment
|
|
|
|
if test -n "$TORTURE_KCONFIG_ARG"
|
|
|
|
then
|
|
|
|
echo $TORTURE_KCONFIG_ARG | tr -s " " "\012" > $T/cmdline
|
|
|
|
echo " --- --kconfig argument" >> $resdir/ConfigFragment.input
|
|
|
|
cat $T/cmdline >> $resdir/ConfigFragment.input
|
|
|
|
config_override.sh $T/Kc1 $T/cmdline > $T/Kc2
|
|
|
|
# Note that "#CHECK#" is not permitted on commandline.
|
|
|
|
else
|
|
|
|
cp $T/Kc1 $T/Kc2
|
|
|
|
fi
|
|
|
|
cat $T/Kc2 >> $resdir/ConfigFragment
|
|
|
|
|
2016-03-30 11:48:06 -06:00
|
|
|
base_resdir=`echo $resdir | sed -e 's/\.[0-9]\+$//'`
|
|
|
|
if test "$base_resdir" != "$resdir" -a -f $base_resdir/bzImage -a -f $base_resdir/vmlinux
|
2013-09-28 15:12:21 -06:00
|
|
|
then
|
2016-03-30 11:48:06 -06:00
|
|
|
# Rerunning previous test, so use that test's kernel.
|
|
|
|
QEMU="`identify_qemu $base_resdir/vmlinux`"
|
2016-05-18 21:42:22 -06:00
|
|
|
BOOT_IMAGE="`identify_boot_image $QEMU`"
|
|
|
|
KERNEL=$base_resdir/${BOOT_IMAGE##*/} # use the last component of ${BOOT_IMAGE}
|
2016-03-30 11:48:06 -06:00
|
|
|
ln -s $base_resdir/Make*.out $resdir # for kvm-recheck.sh
|
|
|
|
ln -s $base_resdir/.config $resdir # for kvm-recheck.sh
|
rcutorture: Don't wait for kernel when all builds fail
Currently, rcutorture groups runs in batches, building each scenario in
a given batch, then invoking qemu to run all the kernels in the batch.
Of course, if a given scenario's kernel fails to build, there is no qemu
run for that scenario. And if all of the kernels in a given batch fail
to build, there are no runs, and rcutorture immediately starts on the
next batch.
But not if --jitter has been specified, which it is by default. In this
case, the jitter scripts are started unconditionally, and rcutorture
waits for them to complete, even though there are no kernels to run.
This commit therefore checks for this situation, and refuses to start
jitter unless at least one of the kernels in the batch built successfully.
This saves substantial time when all scenarios' kernels fail to build,
particularly if a long --duration was specified.
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
2017-05-02 16:22:26 -06:00
|
|
|
# Arch-independent indicator
|
|
|
|
touch $resdir/builtkernel
|
torture: Run kernel build in source directory
For historical reasons, rcutorture places its build products in a
tools/testing/selftests/rcutorture/b1 directory using the O= kbuild
command-line argument. However, doing this requires that the source
directory be pristine: Not just "make clean" pristine, but instead "make
mrproper" (or, equivalently, "make distclean") pristine. Therefore,
rcutorture executes a "make mrproper" before each build. Unfortunately,
"make mrproper" has the side effect of removing pretty much everything,
including tags files and cscope databases, which can be inconvenient
to people whose workflow centers around a single source tree.
This commit therefore makes rcutorture do the build directly in the
source directory, removing the need for "make mrproper". This works
because all needed build products are moved to their proper place in the
"res" directory immediately after the build completes, so that multiple
rcutorture kernels can still run concurrently.
Reported-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.ibm.com>
2019-05-10 22:31:52 -06:00
|
|
|
elif kvm-build.sh $T/Kc2 $resdir
|
2016-03-30 11:48:06 -06:00
|
|
|
then
|
|
|
|
# Had to build a kernel for this test.
|
torture: Run kernel build in source directory
For historical reasons, rcutorture places its build products in a
tools/testing/selftests/rcutorture/b1 directory using the O= kbuild
command-line argument. However, doing this requires that the source
directory be pristine: Not just "make clean" pristine, but instead "make
mrproper" (or, equivalently, "make distclean") pristine. Therefore,
rcutorture executes a "make mrproper" before each build. Unfortunately,
"make mrproper" has the side effect of removing pretty much everything,
including tags files and cscope databases, which can be inconvenient
to people whose workflow centers around a single source tree.
This commit therefore makes rcutorture do the build directly in the
source directory, removing the need for "make mrproper". This works
because all needed build products are moved to their proper place in the
"res" directory immediately after the build completes, so that multiple
rcutorture kernels can still run concurrently.
Reported-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.ibm.com>
2019-05-10 22:31:52 -06:00
|
|
|
QEMU="`identify_qemu vmlinux`"
|
2014-03-06 15:44:46 -07:00
|
|
|
BOOT_IMAGE="`identify_boot_image $QEMU`"
|
torture: Run kernel build in source directory
For historical reasons, rcutorture places its build products in a
tools/testing/selftests/rcutorture/b1 directory using the O= kbuild
command-line argument. However, doing this requires that the source
directory be pristine: Not just "make clean" pristine, but instead "make
mrproper" (or, equivalently, "make distclean") pristine. Therefore,
rcutorture executes a "make mrproper" before each build. Unfortunately,
"make mrproper" has the side effect of removing pretty much everything,
including tags files and cscope databases, which can be inconvenient
to people whose workflow centers around a single source tree.
This commit therefore makes rcutorture do the build directly in the
source directory, removing the need for "make mrproper". This works
because all needed build products are moved to their proper place in the
"res" directory immediately after the build completes, so that multiple
rcutorture kernels can still run concurrently.
Reported-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.ibm.com>
2019-05-10 22:31:52 -06:00
|
|
|
cp vmlinux $resdir
|
|
|
|
cp .config $resdir
|
|
|
|
cp Module.symvers $resdir > /dev/null || :
|
|
|
|
cp System.map $resdir > /dev/null || :
|
2014-03-06 15:44:46 -07:00
|
|
|
if test -n "$BOOT_IMAGE"
|
|
|
|
then
|
torture: Run kernel build in source directory
For historical reasons, rcutorture places its build products in a
tools/testing/selftests/rcutorture/b1 directory using the O= kbuild
command-line argument. However, doing this requires that the source
directory be pristine: Not just "make clean" pristine, but instead "make
mrproper" (or, equivalently, "make distclean") pristine. Therefore,
rcutorture executes a "make mrproper" before each build. Unfortunately,
"make mrproper" has the side effect of removing pretty much everything,
including tags files and cscope databases, which can be inconvenient
to people whose workflow centers around a single source tree.
This commit therefore makes rcutorture do the build directly in the
source directory, removing the need for "make mrproper". This works
because all needed build products are moved to their proper place in the
"res" directory immediately after the build completes, so that multiple
rcutorture kernels can still run concurrently.
Reported-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.ibm.com>
2019-05-10 22:31:52 -06:00
|
|
|
cp $BOOT_IMAGE $resdir
|
2016-05-18 21:42:22 -06:00
|
|
|
KERNEL=$resdir/${BOOT_IMAGE##*/}
|
rcutorture: Don't wait for kernel when all builds fail
Currently, rcutorture groups runs in batches, building each scenario in
a given batch, then invoking qemu to run all the kernels in the batch.
Of course, if a given scenario's kernel fails to build, there is no qemu
run for that scenario. And if all of the kernels in a given batch fail
to build, there are no runs, and rcutorture immediately starts on the
next batch.
But not if --jitter has been specified, which it is by default. In this
case, the jitter scripts are started unconditionally, and rcutorture
waits for them to complete, even though there are no kernels to run.
This commit therefore checks for this situation, and refuses to start
jitter unless at least one of the kernels in the batch built successfully.
This saves substantial time when all scenarios' kernels fail to build,
particularly if a long --duration was specified.
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
2017-05-02 16:22:26 -06:00
|
|
|
# Arch-independent indicator
|
|
|
|
touch $resdir/builtkernel
|
2014-03-06 15:44:46 -07:00
|
|
|
else
|
|
|
|
echo No identifiable boot image, not running KVM, see $resdir.
|
|
|
|
echo Do the torture scripts know about your architecture?
|
|
|
|
fi
|
2013-09-28 15:12:21 -06:00
|
|
|
parse-build.sh $resdir/Make.out $title
|
|
|
|
else
|
2016-03-30 11:48:06 -06:00
|
|
|
# Build failed.
|
torture: Run kernel build in source directory
For historical reasons, rcutorture places its build products in a
tools/testing/selftests/rcutorture/b1 directory using the O= kbuild
command-line argument. However, doing this requires that the source
directory be pristine: Not just "make clean" pristine, but instead "make
mrproper" (or, equivalently, "make distclean") pristine. Therefore,
rcutorture executes a "make mrproper" before each build. Unfortunately,
"make mrproper" has the side effect of removing pretty much everything,
including tags files and cscope databases, which can be inconvenient
to people whose workflow centers around a single source tree.
This commit therefore makes rcutorture do the build directly in the
source directory, removing the need for "make mrproper". This works
because all needed build products are moved to their proper place in the
"res" directory immediately after the build completes, so that multiple
rcutorture kernels can still run concurrently.
Reported-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.ibm.com>
2019-05-10 22:31:52 -06:00
|
|
|
cp .config $resdir || :
|
2013-09-28 15:12:21 -06:00
|
|
|
echo Build failed, not running KVM, see $resdir.
|
2014-01-14 00:16:55 -07:00
|
|
|
if test -f $builddir.wait
|
|
|
|
then
|
|
|
|
mv $builddir.wait $builddir.ready
|
|
|
|
fi
|
2013-09-28 15:12:21 -06:00
|
|
|
exit 1
|
|
|
|
fi
|
2016-03-30 11:48:06 -06:00
|
|
|
if test -f $builddir.wait
|
|
|
|
then
|
|
|
|
mv $builddir.wait $builddir.ready
|
|
|
|
fi
|
2014-01-14 00:16:55 -07:00
|
|
|
while test -f $builddir.ready
|
|
|
|
do
|
|
|
|
sleep 1
|
|
|
|
done
|
2016-03-29 11:50:38 -06:00
|
|
|
seconds=$4
|
2013-09-28 15:12:21 -06:00
|
|
|
qemu_args=$5
|
|
|
|
boot_args=$6
|
|
|
|
|
|
|
|
cd $KVM
|
|
|
|
kstarttime=`awk 'BEGIN { print systime() }' < /dev/null`
|
2014-04-29 10:53:34 -06:00
|
|
|
if test -z "$TORTURE_BUILDONLY"
|
|
|
|
then
|
|
|
|
echo ' ---' `date`: Starting kernel
|
|
|
|
fi
|
2013-09-30 18:17:57 -06:00
|
|
|
|
2013-09-28 15:12:21 -06:00
|
|
|
# Generate -smp qemu argument.
|
2016-05-18 21:42:23 -06:00
|
|
|
qemu_args="-enable-kvm -nographic $qemu_args"
|
2017-05-01 18:49:29 -06:00
|
|
|
cpu_count=`configNR_CPUS.sh $resdir/ConfigFragment`
|
2014-07-21 14:35:10 -06:00
|
|
|
cpu_count=`configfrag_boot_cpus "$boot_args" "$config_template" "$cpu_count"`
|
2013-10-04 14:15:55 -06:00
|
|
|
vcpus=`identify_qemu_vcpus`
|
|
|
|
if test $cpu_count -gt $vcpus
|
2013-09-28 15:12:21 -06:00
|
|
|
then
|
2017-11-03 04:17:27 -06:00
|
|
|
echo CPU count limited from $cpu_count to $vcpus | tee -a $resdir/Warnings
|
2013-10-04 14:15:55 -06:00
|
|
|
cpu_count=$vcpus
|
2013-09-28 15:12:21 -06:00
|
|
|
fi
|
2013-10-04 14:15:55 -06:00
|
|
|
qemu_args="`specify_qemu_cpus "$QEMU" "$qemu_args" "$cpu_count"`"
|
|
|
|
|
|
|
|
# Generate architecture-specific and interaction-specific qemu arguments
|
2015-12-01 16:53:11 -07:00
|
|
|
qemu_args="$qemu_args `identify_qemu_args "$QEMU" "$resdir/console.log"`"
|
2013-10-04 14:15:55 -06:00
|
|
|
|
|
|
|
# Generate qemu -append arguments
|
|
|
|
qemu_append="`identify_qemu_append "$QEMU"`"
|
2013-09-28 15:12:21 -06:00
|
|
|
|
2013-10-09 12:02:00 -06:00
|
|
|
# Pull in Kconfig-fragment boot parameters
|
|
|
|
boot_args="`configfrag_boot_params "$boot_args" "$config_template"`"
|
2014-02-06 18:50:32 -07:00
|
|
|
# Generate kernel-version-specific boot parameters
|
2017-03-25 11:19:50 -06:00
|
|
|
boot_args="`per_version_boot_params "$boot_args" $resdir/.config $seconds`"
|
2013-09-28 15:12:21 -06:00
|
|
|
|
2014-02-26 16:39:41 -07:00
|
|
|
if test -n "$TORTURE_BUILDONLY"
|
2013-10-10 15:52:07 -06:00
|
|
|
then
|
|
|
|
echo Build-only run specified, boot/test omitted.
|
2014-04-29 10:53:34 -06:00
|
|
|
touch $resdir/buildonly
|
2013-10-10 15:52:07 -06:00
|
|
|
exit 0
|
|
|
|
fi
|
2015-12-01 16:53:11 -07:00
|
|
|
echo "NOTE: $QEMU either did not run or was interactive" > $resdir/console.log
|
2018-01-12 15:19:05 -07:00
|
|
|
echo $QEMU $qemu_args -m $TORTURE_QEMU_MEM -kernel $KERNEL -append \"$qemu_append $boot_args\" > $resdir/qemu-cmd
|
2019-04-24 05:39:10 -06:00
|
|
|
( $QEMU $qemu_args -m $TORTURE_QEMU_MEM -kernel $KERNEL -append "$qemu_append $boot_args" > $resdir/qemu-output 2>&1 & echo $! > $resdir/qemu_pid; wait `cat $resdir/qemu_pid`; echo $? > $resdir/qemu-retval ) &
|
2013-09-28 15:12:21 -06:00
|
|
|
commandcompleted=0
|
2016-03-28 15:44:42 -06:00
|
|
|
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
|
2014-03-18 11:34:18 -06:00
|
|
|
while :
|
2013-09-28 15:12:21 -06:00
|
|
|
do
|
2016-03-28 15:44:42 -06:00
|
|
|
if test -z "$qemu_pid" -a -s "$resdir/qemu_pid"
|
|
|
|
then
|
|
|
|
qemu_pid=`cat "$resdir/qemu_pid"`
|
|
|
|
fi
|
2014-03-18 11:34:18 -06:00
|
|
|
kruntime=`awk 'BEGIN { print systime() - '"$kstarttime"' }' < /dev/null`
|
2016-03-28 15:44:42 -06:00
|
|
|
if test -z "$qemu_pid" || kill -0 "$qemu_pid" > /dev/null 2>&1
|
2013-09-28 15:12:21 -06:00
|
|
|
then
|
2014-03-18 11:34:18 -06:00
|
|
|
if test $kruntime -ge $seconds
|
|
|
|
then
|
|
|
|
break;
|
|
|
|
fi
|
2013-09-28 15:12:21 -06:00
|
|
|
sleep 1
|
|
|
|
else
|
|
|
|
commandcompleted=1
|
|
|
|
if test $kruntime -lt $seconds
|
|
|
|
then
|
|
|
|
echo Completed in $kruntime vs. $seconds >> $resdir/Warnings 2>&1
|
2014-03-04 10:06:40 -07:00
|
|
|
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
|
2013-09-28 15:12:21 -06:00
|
|
|
else
|
2016-03-28 15:44:42 -06:00
|
|
|
echo ' ---' `date`: "Kernel done"
|
2013-09-28 15:12:21 -06:00
|
|
|
fi
|
|
|
|
break
|
|
|
|
fi
|
|
|
|
done
|
2016-03-28 15:44:42 -06:00
|
|
|
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"
|
2013-09-28 15:12:21 -06:00
|
|
|
then
|
|
|
|
echo Grace period for qemu job at pid $qemu_pid
|
2016-04-19 17:50:44 -06:00
|
|
|
oldline="`tail $resdir/console.log`"
|
2014-03-18 11:34:18 -06:00
|
|
|
while :
|
2013-09-28 15:12:21 -06:00
|
|
|
do
|
2014-03-18 11:34:18 -06:00
|
|
|
kruntime=`awk 'BEGIN { print systime() - '"$kstarttime"' }' < /dev/null`
|
2013-09-28 15:12:21 -06:00
|
|
|
if kill -0 $qemu_pid > /dev/null 2>&1
|
|
|
|
then
|
2014-03-18 11:34:18 -06:00
|
|
|
:
|
2013-09-28 15:12:21 -06:00
|
|
|
else
|
|
|
|
break
|
|
|
|
fi
|
2016-04-19 17:50:44 -06:00
|
|
|
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/\..*$//'`"
|
2019-06-21 11:32:57 -06:00
|
|
|
if test -z "$last_ts"
|
2016-04-19 17:50:44 -06:00
|
|
|
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))
|
2013-09-28 15:12:21 -06:00
|
|
|
then
|
2014-08-25 21:41:47 -06:00
|
|
|
echo "!!! PID $qemu_pid hung at $kruntime vs. $seconds seconds" >> $resdir/Warnings 2>&1
|
2013-09-28 15:12:21 -06:00
|
|
|
kill -KILL $qemu_pid
|
2014-03-18 11:34:18 -06:00
|
|
|
break
|
2013-09-28 15:12:21 -06:00
|
|
|
fi
|
2016-04-19 17:50:44 -06:00
|
|
|
oldline=$newline
|
|
|
|
sleep 10
|
2013-09-28 15:12:21 -06:00
|
|
|
done
|
2016-03-28 15:44:42 -06:00
|
|
|
elif test -z "$qemu_pid"
|
|
|
|
then
|
|
|
|
echo Unknown PID, cannot kill qemu command
|
2013-09-28 15:12:21 -06:00
|
|
|
fi
|
|
|
|
|
2013-10-28 07:34:22 -06:00
|
|
|
parse-console.sh $resdir/console.log $title
|