[kvm-unit-tests PATCH 3/3] arm/run: use ACCEL to choose between kvm and tcg

Andrew Jones
2015-08-04T07:26:04Z

Inspired by a patch by Alex Bennée. This version uses a new
unittests.cfg variable and includes support for mkstandalone.

Signed-off-by: Andrew Jones <drjones@redhat.com>
---
arm/run | 43 +++++++++++++++++++++++++++++++++++++------
arm/unittests.cfg | 4 +++-
run_tests.sh | 3 ++-
scripts/functions.bash | 8 ++++++--
scripts/mkstandalone.sh | 15 +++++++++++----
5 files changed, 59 insertions(+), 14 deletions(-)

diff --git a/arm/run b/arm/run
index 8cc2fa2571967..4a648697d7fb5 100755
--- a/arm/run
+++ b/arm/run
@@ -7,6 +7,42 @@ fi
source config.mak
processor="$PROCESSOR"

+if [ -c /dev/kvm ]; then
+ if [ "$HOST" = "arm" ] && [ "$ARCH" = "arm" ]; then
+ kvm_available=yes
+ elif [ "$HOST" = "aarch64" ]; then
+ kvm_available=yes
+ fi
+fi
+
+if [ "$ACCEL" = "kvm" ] && [ "$kvm_available" != "yes" ] &&
+ [ "$DRYRUN" != "yes" ]; then
+ printf "skip $TESTNAME (kvm only)\n\n"
+ exit 2
+fi
+
+if [ -z "$ACCEL" ]; then
+ if [ "$DRYRUN" = "yes" ]; then
+ # Output kvm with tcg fallback for dryrun (when both are
+ # allowed), since the command line we output may get used
+ # elsewhere.
+ ACCEL="kvm:tcg"
+ elif [ "$kvm_available" = "yes" ]; then
+ ACCEL="kvm"
+ else
+ ACCEL="tcg"
+ fi
+fi
+
+if [ "$ARCH" = "arm64" ]; then
+ if [[ $ACCEL =~ kvm ]]; then
+ # arm64 must use '-cpu host' with kvm, and we can't use
+ # '-cpu host' with tcg, so we force kvm-only (no fallback)
+ ACCEL="kvm"
+ processor="host"
+ fi
+fi
+
qemu="${QEMU:-qemu-system-$ARCH_NAME}"
qpath=$(which $qemu 2>/dev/null)

@@ -33,15 +69,10 @@ if $qemu $M -chardev testdev,id=id -initrd . 2>&1 \
exit 2
fi

-M='-machine virt,accel=kvm:tcg'
chr_testdev='-device virtio-serial-device'
chr_testdev+=' -device virtconsole,chardev=ctd -chardev testdev,id=ctd'

-# arm64 must use '-cpu host' with kvm
-if [ "$(arch)" = "aarch64" ] && [ "$ARCH" = "arm64" ] && [ -c /dev/kvm ]; then
- processor="host"
-fi
-
+M+=",accel=$ACCEL"
command="$qemu $M -cpu $processor $chr_testdev"
command+=" -display none -serial stdio -kernel"
echo $command "$@"
diff --git a/arm/unittests.cfg b/arm/unittests.cfg
index e068a0cdd9c1f..243c13301811b 100644
--- a/arm/unittests.cfg
+++ b/arm/unittests.cfg
@@ -3,8 +3,10 @@
# file = foo.flat # Name of the flat file to be used
# smp = 2 # Number of processors the VM will use during this test
# extra_params = -append <params...> # Additional parameters used
-# arch = arm/arm64 # Only if test case is specific to one
+# arch = arm|arm64 # Only if test case is specific to one
# groups = group1 group2 # Used to identify test cases with run_tests -g ...
+# accel = kvm|tcg # Optionally specify if test must run with kvm or tcg.
+# # If not specified, then kvm will be used when available.

#
# Test that the configured number of processors (smp = <num>), and
diff --git a/run_tests.sh b/run_tests.sh
index 80b87823c3358..b1b4c541ecaea 100755
--- a/run_tests.sh
+++ b/run_tests.sh
@@ -20,6 +20,7 @@ function run()
local opts="$5"
local arch="$6"
local check="$7"
+ local accel="$8"

if [ -z "$testname" ]; then
return
@@ -46,7 +47,7 @@ function run()
fi
done

- cmdline="TESTNAME=$testname ./$TEST_DIR-run $kernel -smp $smp $opts"
+ cmdline="TESTNAME=$testname ACCEL=$accel ./$TEST_DIR-run $kernel -smp $smp $opts"
if [ $verbose != 0 ]; then
echo $cmdline
fi
diff --git a/scripts/functions.bash b/scripts/functions.bash
index 7ed5a517250bc..f13fe6f88f23d 100644
--- a/scripts/functions.bash
+++ b/scripts/functions.bash
@@ -10,12 +10,13 @@ function for_each_unittest()
local groups
local arch
local check
+ local accel

exec {fd}<"$unittests"

while read -u $fd line; do
if [[ "$line" =~ ^\[(.*)\]$ ]]; then
- "$cmd" "$testname" "$groups" "$smp" "$kernel" "$opts" "$arch" "$check"
+ "$cmd" "$testname" "$groups" "$smp" "$kernel" "$opts" "$arch" "$check" "$accel"
testname=${BASH_REMATCH[1]}
smp=1
kernel=""
@@ -23,6 +24,7 @@ function for_each_unittest()
groups=""
arch=""
check=""
+ accel=""
elif [[ $line =~ ^file\ *=\ *(.*)$ ]]; then
kernel=$TEST_DIR/${BASH_REMATCH[1]}
elif [[ $line =~ ^smp\ *=\ *(.*)$ ]]; then
@@ -35,8 +37,10 @@ function for_each_unittest()
arch=${BASH_REMATCH[1]}
elif [[ $line =~ ^check\ *=\ *(.*)$ ]]; then
check=${BASH_REMATCH[1]}
+ elif [[ $line =~ ^accel\ *=\ *(.*)$ ]]; then
+ accel=${BASH_REMATCH[1]}
fi
done
- "$cmd" "$testname" "$groups" "$smp" "$kernel" "$opts" "$arch" "$check"
+ "$cmd" "$testname" "$groups" "$smp" "$kernel" "$opts" "$arch" "$check" "$accel"
exec {fd}<&-
}
diff --git a/scripts/mkstandalone.sh b/scripts/mkstandalone.sh
index 4cf346ab87d24..0c39451e538c9 100755
--- a/scripts/mkstandalone.sh
+++ b/scripts/mkstandalone.sh
@@ -29,6 +29,7 @@ function mkstandalone()
local opts="$5"
local arch="$6"
local check="$7"
+ local accel="$8"

if [ -z "$testname" ]; then
return 1
@@ -39,7 +40,7 @@ function mkstandalone()
fi

standalone=tests/$testname
- cmdline=$(DRYRUN=yes ./$TEST_DIR-run $kernel)
+ cmdline=$(DRYRUN=yes ACCEL=$accel ./$TEST_DIR-run $kernel)
if [ $? -ne 0 ]; then
echo $cmdline
exit 1
@@ -94,10 +95,16 @@ qemu="$qemu"
if [ "\$QEMU" ]; then
qemu="\$QEMU"
fi
-cmdline="\`echo '$cmdline' | sed s%$kernel%\$bin%\`"
echo \$qemu $cmdline -smp $smp $opts
-\$qemu \$cmdline -smp $smp $opts
-ret=\$?
+
+cmdline="\`echo '$cmdline' | sed s%$kernel%_NO_FILE_4Uhere_%\`"
+if \$qemu \$cmdline 2>&1 | grep 'No accelerator found'; then
+ ret=2
+else
+ cmdline="\`echo '$cmdline' | sed s%$kernel%\$bin%\`"
+ \$qemu \$cmdline -smp $smp $opts
+ ret=\$?
+fi
echo Return value from qemu: \$ret
if [ \$ret -le 1 ]; then
echo PASS $testname 1>&2
--
2.4.3