All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexandru Elisei <alexandru.elisei@arm.com>
To: drjones@redhat.com, thuth@redhat.com, pbonzini@redhat.com,
	lvivier@redhat.com, kvm-ppc@vger.kernel.org, david@redhat.com,
	frankja@linux.ibm.com, cohuck@redhat.com, imbrenda@linux.ibm.com,
	linux-s390@vger.kernel.org, kvm@vger.kernel.org,
	kvmarm@lists.cs.columbia.edu
Cc: andre.przywara@arm.com, maz@kernel.org, vivek.gautam@arm.com
Subject: [kvm-unit-tests RFC PATCH 3/5] run_tests.sh: Add kvmtool support
Date: Fri,  2 Jul 2021 17:31:20 +0100	[thread overview]
Message-ID: <20210702163122.96110-4-alexandru.elisei@arm.com> (raw)
In-Reply-To: <20210702163122.96110-1-alexandru.elisei@arm.com>

Modify run_tests.sh to use kvmtool instead of qemu to run tests when
kvm-unit-tests has been configured with --target=kvmtool.

Example invocation:

$ ./configure --target=kvmtool
$ make clean && make
$ ./run_scripts.sh

A custom location for the kvmtool binary can be set using the environment
variable KVMTOOL:

$ KVMTOOL=/path/to/kvmtool/binary ./run_scripts.sh

Standalone test support is absent, but will be added in subsequent patches.

Signed-off-by: Alexandru Elisei <alexandru.elisei@arm.com>
---
 scripts/arch-run.bash   |  48 ++++++++++++++++--
 scripts/runtime.bash    |  94 ++++++++++++++++++++++++++++------
 scripts/mkstandalone.sh |   5 ++
 arm/run                 | 110 ++++++++++++++++++++++++----------------
 run_tests.sh            |  11 +++-
 5 files changed, 204 insertions(+), 64 deletions(-)

diff --git a/scripts/arch-run.bash b/scripts/arch-run.bash
index 8ceed53ed7f8..b916b0e79aca 100644
--- a/scripts/arch-run.bash
+++ b/scripts/arch-run.bash
@@ -69,16 +69,39 @@ run_qemu ()
 	return $ret
 }
 
+run_kvmtool()
+{
+	local stdout errors ret sig
+
+	# kvmtool doesn't allow an initrd argument with --firmware, but configure
+	# sets CONFIG_ERRATA_FORCE in lib/config.h for the kvmtool target.
+
+	# stdout to {stdout}, stderr to $errors and stderr
+	exec {stdout}>&1
+	errors=$("${@}" </dev/null 2> >(tee /dev/stderr) > /dev/fd/$stdout)
+	ret=$?
+	exec {stdout}>&-
+
+	# ret=0 success, everything else is failure.
+	return $ret
+}
+
 run_test_status ()
 {
-	local stdout ret
+	local stdout ret exit_status
 
 	exec {stdout}>&1
-	lines=$(run_qemu "$@" > >(tee /dev/fd/$stdout))
+	if [ "$TARGET" = "kvmtool" ]; then
+		lines=$(run_kvmtool "$@" > >(tee /dev/fd/$stdout))
+		exit_status=0
+	else
+		lines=$(run_qemu "$@" > >(tee /dev/fd/$stdout))
+		exit_status=1
+	fi
 	ret=$?
 	exec {stdout}>&-
 
-	if [ $ret -eq 1 ]; then
+	if [ $ret -eq $exit_status ]; then
 		testret=$(grep '^EXIT: ' <<<"$lines" | sed 's/.*STATUS=\([0-9][0-9]*\).*/\1/')
 		if [ "$testret" ]; then
 			if [ $testret -eq 1 ]; then
@@ -193,6 +216,25 @@ search_qemu_binary ()
 	export PATH=$save_path
 }
 
+search_kvmtool_binary ()
+{
+	local lkvm kvmtool
+
+	for lkvm in ${KVMTOOL:-lkvm vm lkvm-static}; do
+		if $lkvm --help 2>/dev/null | grep -q 'The most commonly used'; then
+			kvmtool="$lkvm"
+			break
+		fi
+	done
+
+	if [ -z "$kvmtool" ]; then
+		echo "A kvmtool binary was not found." >&2
+		echo "You can set a custom location by using the KVMTOOL=<path> environment variable." >&2
+		return 2
+	fi
+	command -v $kvmtool
+}
+
 initrd_create ()
 {
 	if [ "$ENVIRON_DEFAULT" = "yes" ]; then
diff --git a/scripts/runtime.bash b/scripts/runtime.bash
index 132389c7dd59..23b238a6ab6f 100644
--- a/scripts/runtime.bash
+++ b/scripts/runtime.bash
@@ -12,14 +12,19 @@ extract_summary()
     tail -3 | grep '^SUMMARY: ' | sed 's/^SUMMARY: /(/;s/'"$cr"'\{0,1\}$/)/'
 }
 
-# We assume that QEMU is going to work if it tried to load the kernel
+# We assume that QEMU/kvmtool is going to work if it tried to load the kernel
 premature_failure()
 {
     local log="$(eval $(get_cmdline _NO_FILE_4Uhere_) 2>&1)"
 
-    echo "$log" | grep "_NO_FILE_4Uhere_" |
-        grep -q -e "could not \(load\|open\) kernel" -e "error loading" &&
-        return 1
+    if [ "$TARGET" = "kvmtool" ]; then
+        echo "$log" | grep "Fatal: unable to load firmware image _NO_FILE_4Uhere_" &&
+            return 1
+    else
+        echo "$log" | grep "_NO_FILE_4Uhere_" |
+            grep -q -e "could not \(load\|open\) kernel" -e "error loading" &&
+            return 1
+    fi
 
     RUNTIME_log_stderr <<< "$log"
 
@@ -30,7 +35,14 @@ premature_failure()
 get_cmdline()
 {
     local kernel=$1
-    echo "TESTNAME=$testname TIMEOUT=$timeout ACCEL=$accel $RUNTIME_arch_run $kernel -smp $smp $opts"
+    local smp_param
+
+    if [ "$TARGET" = "kvmtool" ]; then
+        smp_param="--cpus $smp"
+    else
+        smp_param="-smp $smp"
+    fi
+    echo "TESTNAME=$testname TIMEOUT=$timeout ACCEL=$accel $RUNTIME_arch_run $kernel $smp_param $opts"
 }
 
 skip_nodefault()
@@ -70,6 +82,35 @@ function find_word()
     grep -Fq " $1 " <<< " $2 "
 }
 
+fixup_kvmtool_opts()
+{
+    local opts=$1
+    local groups=$2
+    local gic
+    local gic_version
+
+    if find_word "pmu" $groups; then
+        opts+=" --pmu"
+    fi
+
+    if find_word "its" $groups; then
+        gic_version=3
+        gic="gicv3-its"
+    elif [[ "$opts" =~ -machine\ *gic-version=(2|3) ]]; then
+        gic_version="${BASH_REMATCH[1]}"
+        gic="gicv$gic_version"
+    fi
+
+    if [ -n "$gic" ]; then
+        opts=${opts/-machine gic-version=$gic_version/}
+        opts+=" --irqchip=$gic"
+    fi
+
+    opts=${opts/-append/--params}
+
+    echo "$opts"
+}
+
 function run()
 {
     local testname="$1"
@@ -105,7 +146,12 @@ function run()
         return 2
     fi
 
-    if [ -n "$accel" ] && [ -n "$ACCEL" ] && [ "$accel" != "$ACCEL" ]; then
+    if [ "$TARGET" = "kvmtool" ]; then
+        if [ -n "$accel" ] && [ "$accel" != "kvm" ]; then
+            print_result "SKIP" $testname "" "$accel not supported by kvmtool"
+            return 2
+        fi
+    elif [ -n "$accel" ] && [ -n "$ACCEL" ] && [ "$accel" != "$ACCEL" ]; then
         print_result "SKIP" $testname "" "$accel only, but ACCEL=$ACCEL"
         return 2
     elif [ -n "$ACCEL" ]; then
@@ -126,6 +172,10 @@ function run()
         done
     fi
 
+    if [ "$TARGET" = "kvmtool" ]; then
+        opts=$(fixup_kvmtool_opts "$opts" "$groups")
+    fi
+
     last_line=$(premature_failure > >(tail -1)) && {
         print_result "SKIP" $testname "" "$last_line"
         return 77
@@ -165,13 +215,25 @@ function run()
 #
 # Probe for MAX_SMP, in case it's less than the number of host cpus.
 #
-# This probing currently only works for ARM, as x86 bails on another
-# error first. Also, this probing isn't necessary for any ARM hosts
-# running kernels later than v4.3, i.e. those including ef748917b52
-# "arm/arm64: KVM: Remove 'config KVM_ARM_MAX_VCPUS'". So, at some
-# point when maintaining the while loop gets too tiresome, we can
-# just remove it...
-while $RUNTIME_arch_run _NO_FILE_4Uhere_ -smp $MAX_SMP \
-		|& grep -qi 'exceeds max CPUs'; do
-	MAX_SMP=$((MAX_SMP >> 1))
-done
+# This probing currently only works for ARM, as x86 bails on another error
+# first. Also, this probing isn't necessary for any ARM hosts running kernels
+# later than v4.3, i.e. those including ef748917b52 "arm/arm64: KVM: Remove
+# 'config KVM_ARM_MAX_VCPUS'". So, at some point when maintaining the while loop
+# gets too tiresome, we can just remove it...
+#
+# We don't need this check for kvmtool, as kvmtool will automatically limit the
+# number of VCPUs to what the host supports instead of exiting with an error.
+# kvmtool prints a message when that happens, but it's harmless and the chance
+# of running a kernel so old that the number of VCPUs is smaller than the number
+# of physical CPUs is vanishingly small.
+#
+# For qemu this check is still needed. For qemu-system-aarch64 version 6.0.0,
+# using TCG, the maximum number of VCPUs that mach-virt supports is 8. If a test
+# is running on a recent x86 machine, there's a fairly good chance that more
+# than 8 logical CPUs are available.
+if [ "$TARGET" = "qemu" ]; then
+    while $RUNTIME_arch_run _NO_FILE_4Uhere_ -smp $MAX_SMP \
+            |& grep -qi 'exceeds max CPUs'; do
+        MAX_SMP=$((MAX_SMP >> 1))
+    done
+fi
diff --git a/scripts/mkstandalone.sh b/scripts/mkstandalone.sh
index cefdec30cb33..16f461c06842 100755
--- a/scripts/mkstandalone.sh
+++ b/scripts/mkstandalone.sh
@@ -95,6 +95,11 @@ function mkstandalone()
 	echo Written $standalone.
 }
 
+if [ "$TARGET" = "kvmtool" ]; then
+	echo "Standalone tests not supported with kvmtool"
+	exit 2
+fi
+
 if [ "$ENVIRON_DEFAULT" = "yes" ] && [ "$ERRATATXT" ] && [ ! -f "$ERRATATXT" ]; then
 	echo "$ERRATATXT not found. (ERRATATXT=$ERRATATXT)" >&2
 	exit 2
diff --git a/arm/run b/arm/run
index a390ca5ae0ba..cc5890e7fec4 100755
--- a/arm/run
+++ b/arm/run
@@ -8,59 +8,81 @@ if [ -z "$STANDALONE" ]; then
 	source config.mak
 	source scripts/arch-run.bash
 fi
-processor="$PROCESSOR"
 
-ACCEL=$(get_qemu_accelerator) ||
-	exit $?
+run_test_qemu()
+{
+    processor="$PROCESSOR"
 
-qemu=$(search_qemu_binary) ||
-	exit $?
+    ACCEL=$(get_qemu_accelerator) ||
+        exit $?
 
-if ! $qemu -machine '?' 2>&1 | grep 'ARM Virtual Machine' > /dev/null; then
-	echo "$qemu doesn't support mach-virt ('-machine virt'). Exiting."
-	exit 2
-fi
+    qemu=$(search_qemu_binary) ||
+        exit $?
 
-M='-machine virt'
+    if ! $qemu -machine '?' 2>&1 | grep 'ARM Virtual Machine' > /dev/null; then
+        echo "$qemu doesn't support mach-virt ('-machine virt'). Exiting."
+        exit 2
+    fi
 
-if [ "$ACCEL" = "kvm" ]; then
-	if $qemu $M,\? 2>&1 | grep gic-version > /dev/null; then
-		M+=',gic-version=host'
-	fi
-	if [ "$HOST" = "aarch64" ] || [ "$HOST" = "arm" ]; then
-		processor="host"
-		if [ "$ARCH" = "arm" ] && [ "$HOST" = "aarch64" ]; then
-			processor+=",aarch64=off"
-		fi
-	fi
-fi
+    M='-machine virt'
 
-if [ "$ARCH" = "arm" ]; then
-	M+=",highmem=off"
-fi
+    if [ "$ACCEL" = "kvm" ]; then
+        if $qemu $M,\? 2>&1 | grep gic-version > /dev/null; then
+            M+=',gic-version=host'
+        fi
+        if [ "$HOST" = "aarch64" ] || [ "$HOST" = "arm" ]; then
+            processor="host"
+            if [ "$ARCH" = "arm" ] && [ "$HOST" = "aarch64" ]; then
+                processor+=",aarch64=off"
+            fi
+        fi
+    fi
 
-if ! $qemu $M -device '?' 2>&1 | grep virtconsole > /dev/null; then
-	echo "$qemu doesn't support virtio-console for chr-testdev. Exiting."
-	exit 2
-fi
+    if [ "$ARCH" = "arm" ]; then
+        M+=",highmem=off"
+    fi
 
-if $qemu $M -chardev testdev,id=id -initrd . 2>&1 \
-		| grep backend > /dev/null; then
-	echo "$qemu doesn't support chr-testdev. Exiting."
-	exit 2
-fi
+    if ! $qemu $M -device '?' 2>&1 | grep virtconsole > /dev/null; then
+        echo "$qemu doesn't support virtio-console for chr-testdev. Exiting."
+        exit 2
+    fi
 
-chr_testdev='-device virtio-serial-device'
-chr_testdev+=' -device virtconsole,chardev=ctd -chardev testdev,id=ctd'
+    if $qemu $M -chardev testdev,id=id -initrd . 2>&1 \
+            | grep backend > /dev/null; then
+        echo "$qemu doesn't support chr-testdev. Exiting."
+        exit 2
+    fi
 
-pci_testdev=
-if $qemu $M -device '?' 2>&1 | grep pci-testdev > /dev/null; then
-	pci_testdev="-device pci-testdev"
-fi
+    chr_testdev='-device virtio-serial-device'
+    chr_testdev+=' -device virtconsole,chardev=ctd -chardev testdev,id=ctd'
+
+    pci_testdev=
+    if $qemu $M -device '?' 2>&1 | grep pci-testdev > /dev/null; then
+        pci_testdev="-device pci-testdev"
+    fi
+
+    M+=",accel=$ACCEL"
+    command="$qemu -nodefaults $M -cpu $processor $chr_testdev $pci_testdev"
+    command+=" -display none -serial stdio -kernel"
+    command="$(migration_cmd) $(timeout_cmd) $command"
+
+    run_qemu $command "$@"
+}
+
+run_test_kvmtool()
+{
+    kvmtool=$(search_kvmtool_binary) ||
+        exit $?
 
-M+=",accel=$ACCEL"
-command="$qemu -nodefaults $M -cpu $processor $chr_testdev $pci_testdev"
-command+=" -display none -serial stdio -kernel"
-command="$(migration_cmd) $(timeout_cmd) $command"
+    local command="$(timeout_cmd) $kvmtool run --firmware "
+    run_test_status $command "$@"
+}
 
-run_qemu $command "$@"
+case "$TARGET" in
+    "qemu")
+        run_test_qemu "$@"
+        ;;
+    "kvmtool")
+        run_test_kvmtool "$@"
+        ;;
+esac
diff --git a/run_tests.sh b/run_tests.sh
index 65108e73a2c0..b010ee3ab348 100755
--- a/run_tests.sh
+++ b/run_tests.sh
@@ -26,7 +26,9 @@ Usage: $0 [-h] [-v] [-a] [-g group] [-j NUM-TASKS] [-t]
     -t, --tap13     Output test results in TAP format
 
 Set the environment variable QEMU=/path/to/qemu-system-ARCH to
-specify the appropriate qemu binary for ARCH-run.
+specify the appropriate qemu binary for ARCH-run. For arm/arm64, kvmtool
+is also supported and the environment variable KVMTOOL=/path/to/kvmtool
+can be used to specify a custom location for the kvmtool binary.
 
 EOF
 }
@@ -41,6 +43,13 @@ if [ $? -ne 4 ]; then
     exit 1
 fi
 
+if [ "$TARGET" = "kvmtool" ]; then
+    if [ -n "$ACCEL" ] && [ "$ACCEL" != "kvm" ]; then
+        echo "kvmtool supports only the kvm accelerator"
+        exit 1
+    fi
+fi
+
 only_tests=""
 args=`getopt -u -o ag:htj:v -l all,group:,help,tap13,parallel:,verbose -- $*`
 [ $? -ne 0 ] && exit 2;
-- 
2.32.0


WARNING: multiple messages have this Message-ID (diff)
From: Alexandru Elisei <alexandru.elisei@arm.com>
To: drjones@redhat.com, thuth@redhat.com, pbonzini@redhat.com,
	lvivier@redhat.com, kvm-ppc@vger.kernel.org, david@redhat.com,
	frankja@linux.ibm.com, cohuck@redhat.com, imbrenda@linux.ibm.com,
	linux-s390@vger.kernel.org, kvm@vger.kernel.org,
	kvmarm@lists.cs.columbia.edu
Cc: vivek.gautam@arm.com, andre.przywara@arm.com, maz@kernel.org
Subject: [kvm-unit-tests RFC PATCH 3/5] run_tests.sh: Add kvmtool support
Date: Fri,  2 Jul 2021 17:31:20 +0100	[thread overview]
Message-ID: <20210702163122.96110-4-alexandru.elisei@arm.com> (raw)
In-Reply-To: <20210702163122.96110-1-alexandru.elisei@arm.com>

Modify run_tests.sh to use kvmtool instead of qemu to run tests when
kvm-unit-tests has been configured with --target=kvmtool.

Example invocation:

$ ./configure --target=kvmtool
$ make clean && make
$ ./run_scripts.sh

A custom location for the kvmtool binary can be set using the environment
variable KVMTOOL:

$ KVMTOOL=/path/to/kvmtool/binary ./run_scripts.sh

Standalone test support is absent, but will be added in subsequent patches.

Signed-off-by: Alexandru Elisei <alexandru.elisei@arm.com>
---
 scripts/arch-run.bash   |  48 ++++++++++++++++--
 scripts/runtime.bash    |  94 ++++++++++++++++++++++++++++------
 scripts/mkstandalone.sh |   5 ++
 arm/run                 | 110 ++++++++++++++++++++++++----------------
 run_tests.sh            |  11 +++-
 5 files changed, 204 insertions(+), 64 deletions(-)

diff --git a/scripts/arch-run.bash b/scripts/arch-run.bash
index 8ceed53ed7f8..b916b0e79aca 100644
--- a/scripts/arch-run.bash
+++ b/scripts/arch-run.bash
@@ -69,16 +69,39 @@ run_qemu ()
 	return $ret
 }
 
+run_kvmtool()
+{
+	local stdout errors ret sig
+
+	# kvmtool doesn't allow an initrd argument with --firmware, but configure
+	# sets CONFIG_ERRATA_FORCE in lib/config.h for the kvmtool target.
+
+	# stdout to {stdout}, stderr to $errors and stderr
+	exec {stdout}>&1
+	errors=$("${@}" </dev/null 2> >(tee /dev/stderr) > /dev/fd/$stdout)
+	ret=$?
+	exec {stdout}>&-
+
+	# ret=0 success, everything else is failure.
+	return $ret
+}
+
 run_test_status ()
 {
-	local stdout ret
+	local stdout ret exit_status
 
 	exec {stdout}>&1
-	lines=$(run_qemu "$@" > >(tee /dev/fd/$stdout))
+	if [ "$TARGET" = "kvmtool" ]; then
+		lines=$(run_kvmtool "$@" > >(tee /dev/fd/$stdout))
+		exit_status=0
+	else
+		lines=$(run_qemu "$@" > >(tee /dev/fd/$stdout))
+		exit_status=1
+	fi
 	ret=$?
 	exec {stdout}>&-
 
-	if [ $ret -eq 1 ]; then
+	if [ $ret -eq $exit_status ]; then
 		testret=$(grep '^EXIT: ' <<<"$lines" | sed 's/.*STATUS=\([0-9][0-9]*\).*/\1/')
 		if [ "$testret" ]; then
 			if [ $testret -eq 1 ]; then
@@ -193,6 +216,25 @@ search_qemu_binary ()
 	export PATH=$save_path
 }
 
+search_kvmtool_binary ()
+{
+	local lkvm kvmtool
+
+	for lkvm in ${KVMTOOL:-lkvm vm lkvm-static}; do
+		if $lkvm --help 2>/dev/null | grep -q 'The most commonly used'; then
+			kvmtool="$lkvm"
+			break
+		fi
+	done
+
+	if [ -z "$kvmtool" ]; then
+		echo "A kvmtool binary was not found." >&2
+		echo "You can set a custom location by using the KVMTOOL=<path> environment variable." >&2
+		return 2
+	fi
+	command -v $kvmtool
+}
+
 initrd_create ()
 {
 	if [ "$ENVIRON_DEFAULT" = "yes" ]; then
diff --git a/scripts/runtime.bash b/scripts/runtime.bash
index 132389c7dd59..23b238a6ab6f 100644
--- a/scripts/runtime.bash
+++ b/scripts/runtime.bash
@@ -12,14 +12,19 @@ extract_summary()
     tail -3 | grep '^SUMMARY: ' | sed 's/^SUMMARY: /(/;s/'"$cr"'\{0,1\}$/)/'
 }
 
-# We assume that QEMU is going to work if it tried to load the kernel
+# We assume that QEMU/kvmtool is going to work if it tried to load the kernel
 premature_failure()
 {
     local log="$(eval $(get_cmdline _NO_FILE_4Uhere_) 2>&1)"
 
-    echo "$log" | grep "_NO_FILE_4Uhere_" |
-        grep -q -e "could not \(load\|open\) kernel" -e "error loading" &&
-        return 1
+    if [ "$TARGET" = "kvmtool" ]; then
+        echo "$log" | grep "Fatal: unable to load firmware image _NO_FILE_4Uhere_" &&
+            return 1
+    else
+        echo "$log" | grep "_NO_FILE_4Uhere_" |
+            grep -q -e "could not \(load\|open\) kernel" -e "error loading" &&
+            return 1
+    fi
 
     RUNTIME_log_stderr <<< "$log"
 
@@ -30,7 +35,14 @@ premature_failure()
 get_cmdline()
 {
     local kernel=$1
-    echo "TESTNAME=$testname TIMEOUT=$timeout ACCEL=$accel $RUNTIME_arch_run $kernel -smp $smp $opts"
+    local smp_param
+
+    if [ "$TARGET" = "kvmtool" ]; then
+        smp_param="--cpus $smp"
+    else
+        smp_param="-smp $smp"
+    fi
+    echo "TESTNAME=$testname TIMEOUT=$timeout ACCEL=$accel $RUNTIME_arch_run $kernel $smp_param $opts"
 }
 
 skip_nodefault()
@@ -70,6 +82,35 @@ function find_word()
     grep -Fq " $1 " <<< " $2 "
 }
 
+fixup_kvmtool_opts()
+{
+    local opts=$1
+    local groups=$2
+    local gic
+    local gic_version
+
+    if find_word "pmu" $groups; then
+        opts+=" --pmu"
+    fi
+
+    if find_word "its" $groups; then
+        gic_version=3
+        gic="gicv3-its"
+    elif [[ "$opts" =~ -machine\ *gic-version=(2|3) ]]; then
+        gic_version="${BASH_REMATCH[1]}"
+        gic="gicv$gic_version"
+    fi
+
+    if [ -n "$gic" ]; then
+        opts=${opts/-machine gic-version=$gic_version/}
+        opts+=" --irqchip=$gic"
+    fi
+
+    opts=${opts/-append/--params}
+
+    echo "$opts"
+}
+
 function run()
 {
     local testname="$1"
@@ -105,7 +146,12 @@ function run()
         return 2
     fi
 
-    if [ -n "$accel" ] && [ -n "$ACCEL" ] && [ "$accel" != "$ACCEL" ]; then
+    if [ "$TARGET" = "kvmtool" ]; then
+        if [ -n "$accel" ] && [ "$accel" != "kvm" ]; then
+            print_result "SKIP" $testname "" "$accel not supported by kvmtool"
+            return 2
+        fi
+    elif [ -n "$accel" ] && [ -n "$ACCEL" ] && [ "$accel" != "$ACCEL" ]; then
         print_result "SKIP" $testname "" "$accel only, but ACCEL=$ACCEL"
         return 2
     elif [ -n "$ACCEL" ]; then
@@ -126,6 +172,10 @@ function run()
         done
     fi
 
+    if [ "$TARGET" = "kvmtool" ]; then
+        opts=$(fixup_kvmtool_opts "$opts" "$groups")
+    fi
+
     last_line=$(premature_failure > >(tail -1)) && {
         print_result "SKIP" $testname "" "$last_line"
         return 77
@@ -165,13 +215,25 @@ function run()
 #
 # Probe for MAX_SMP, in case it's less than the number of host cpus.
 #
-# This probing currently only works for ARM, as x86 bails on another
-# error first. Also, this probing isn't necessary for any ARM hosts
-# running kernels later than v4.3, i.e. those including ef748917b52
-# "arm/arm64: KVM: Remove 'config KVM_ARM_MAX_VCPUS'". So, at some
-# point when maintaining the while loop gets too tiresome, we can
-# just remove it...
-while $RUNTIME_arch_run _NO_FILE_4Uhere_ -smp $MAX_SMP \
-		|& grep -qi 'exceeds max CPUs'; do
-	MAX_SMP=$((MAX_SMP >> 1))
-done
+# This probing currently only works for ARM, as x86 bails on another error
+# first. Also, this probing isn't necessary for any ARM hosts running kernels
+# later than v4.3, i.e. those including ef748917b52 "arm/arm64: KVM: Remove
+# 'config KVM_ARM_MAX_VCPUS'". So, at some point when maintaining the while loop
+# gets too tiresome, we can just remove it...
+#
+# We don't need this check for kvmtool, as kvmtool will automatically limit the
+# number of VCPUs to what the host supports instead of exiting with an error.
+# kvmtool prints a message when that happens, but it's harmless and the chance
+# of running a kernel so old that the number of VCPUs is smaller than the number
+# of physical CPUs is vanishingly small.
+#
+# For qemu this check is still needed. For qemu-system-aarch64 version 6.0.0,
+# using TCG, the maximum number of VCPUs that mach-virt supports is 8. If a test
+# is running on a recent x86 machine, there's a fairly good chance that more
+# than 8 logical CPUs are available.
+if [ "$TARGET" = "qemu" ]; then
+    while $RUNTIME_arch_run _NO_FILE_4Uhere_ -smp $MAX_SMP \
+            |& grep -qi 'exceeds max CPUs'; do
+        MAX_SMP=$((MAX_SMP >> 1))
+    done
+fi
diff --git a/scripts/mkstandalone.sh b/scripts/mkstandalone.sh
index cefdec30cb33..16f461c06842 100755
--- a/scripts/mkstandalone.sh
+++ b/scripts/mkstandalone.sh
@@ -95,6 +95,11 @@ function mkstandalone()
 	echo Written $standalone.
 }
 
+if [ "$TARGET" = "kvmtool" ]; then
+	echo "Standalone tests not supported with kvmtool"
+	exit 2
+fi
+
 if [ "$ENVIRON_DEFAULT" = "yes" ] && [ "$ERRATATXT" ] && [ ! -f "$ERRATATXT" ]; then
 	echo "$ERRATATXT not found. (ERRATATXT=$ERRATATXT)" >&2
 	exit 2
diff --git a/arm/run b/arm/run
index a390ca5ae0ba..cc5890e7fec4 100755
--- a/arm/run
+++ b/arm/run
@@ -8,59 +8,81 @@ if [ -z "$STANDALONE" ]; then
 	source config.mak
 	source scripts/arch-run.bash
 fi
-processor="$PROCESSOR"
 
-ACCEL=$(get_qemu_accelerator) ||
-	exit $?
+run_test_qemu()
+{
+    processor="$PROCESSOR"
 
-qemu=$(search_qemu_binary) ||
-	exit $?
+    ACCEL=$(get_qemu_accelerator) ||
+        exit $?
 
-if ! $qemu -machine '?' 2>&1 | grep 'ARM Virtual Machine' > /dev/null; then
-	echo "$qemu doesn't support mach-virt ('-machine virt'). Exiting."
-	exit 2
-fi
+    qemu=$(search_qemu_binary) ||
+        exit $?
 
-M='-machine virt'
+    if ! $qemu -machine '?' 2>&1 | grep 'ARM Virtual Machine' > /dev/null; then
+        echo "$qemu doesn't support mach-virt ('-machine virt'). Exiting."
+        exit 2
+    fi
 
-if [ "$ACCEL" = "kvm" ]; then
-	if $qemu $M,\? 2>&1 | grep gic-version > /dev/null; then
-		M+=',gic-version=host'
-	fi
-	if [ "$HOST" = "aarch64" ] || [ "$HOST" = "arm" ]; then
-		processor="host"
-		if [ "$ARCH" = "arm" ] && [ "$HOST" = "aarch64" ]; then
-			processor+=",aarch64=off"
-		fi
-	fi
-fi
+    M='-machine virt'
 
-if [ "$ARCH" = "arm" ]; then
-	M+=",highmem=off"
-fi
+    if [ "$ACCEL" = "kvm" ]; then
+        if $qemu $M,\? 2>&1 | grep gic-version > /dev/null; then
+            M+=',gic-version=host'
+        fi
+        if [ "$HOST" = "aarch64" ] || [ "$HOST" = "arm" ]; then
+            processor="host"
+            if [ "$ARCH" = "arm" ] && [ "$HOST" = "aarch64" ]; then
+                processor+=",aarch64=off"
+            fi
+        fi
+    fi
 
-if ! $qemu $M -device '?' 2>&1 | grep virtconsole > /dev/null; then
-	echo "$qemu doesn't support virtio-console for chr-testdev. Exiting."
-	exit 2
-fi
+    if [ "$ARCH" = "arm" ]; then
+        M+=",highmem=off"
+    fi
 
-if $qemu $M -chardev testdev,id=id -initrd . 2>&1 \
-		| grep backend > /dev/null; then
-	echo "$qemu doesn't support chr-testdev. Exiting."
-	exit 2
-fi
+    if ! $qemu $M -device '?' 2>&1 | grep virtconsole > /dev/null; then
+        echo "$qemu doesn't support virtio-console for chr-testdev. Exiting."
+        exit 2
+    fi
 
-chr_testdev='-device virtio-serial-device'
-chr_testdev+=' -device virtconsole,chardev=ctd -chardev testdev,id=ctd'
+    if $qemu $M -chardev testdev,id=id -initrd . 2>&1 \
+            | grep backend > /dev/null; then
+        echo "$qemu doesn't support chr-testdev. Exiting."
+        exit 2
+    fi
 
-pci_testdev=
-if $qemu $M -device '?' 2>&1 | grep pci-testdev > /dev/null; then
-	pci_testdev="-device pci-testdev"
-fi
+    chr_testdev='-device virtio-serial-device'
+    chr_testdev+=' -device virtconsole,chardev=ctd -chardev testdev,id=ctd'
+
+    pci_testdev=
+    if $qemu $M -device '?' 2>&1 | grep pci-testdev > /dev/null; then
+        pci_testdev="-device pci-testdev"
+    fi
+
+    M+=",accel=$ACCEL"
+    command="$qemu -nodefaults $M -cpu $processor $chr_testdev $pci_testdev"
+    command+=" -display none -serial stdio -kernel"
+    command="$(migration_cmd) $(timeout_cmd) $command"
+
+    run_qemu $command "$@"
+}
+
+run_test_kvmtool()
+{
+    kvmtool=$(search_kvmtool_binary) ||
+        exit $?
 
-M+=",accel=$ACCEL"
-command="$qemu -nodefaults $M -cpu $processor $chr_testdev $pci_testdev"
-command+=" -display none -serial stdio -kernel"
-command="$(migration_cmd) $(timeout_cmd) $command"
+    local command="$(timeout_cmd) $kvmtool run --firmware "
+    run_test_status $command "$@"
+}
 
-run_qemu $command "$@"
+case "$TARGET" in
+    "qemu")
+        run_test_qemu "$@"
+        ;;
+    "kvmtool")
+        run_test_kvmtool "$@"
+        ;;
+esac
diff --git a/run_tests.sh b/run_tests.sh
index 65108e73a2c0..b010ee3ab348 100755
--- a/run_tests.sh
+++ b/run_tests.sh
@@ -26,7 +26,9 @@ Usage: $0 [-h] [-v] [-a] [-g group] [-j NUM-TASKS] [-t]
     -t, --tap13     Output test results in TAP format
 
 Set the environment variable QEMU=/path/to/qemu-system-ARCH to
-specify the appropriate qemu binary for ARCH-run.
+specify the appropriate qemu binary for ARCH-run. For arm/arm64, kvmtool
+is also supported and the environment variable KVMTOOL=/path/to/kvmtool
+can be used to specify a custom location for the kvmtool binary.
 
 EOF
 }
@@ -41,6 +43,13 @@ if [ $? -ne 4 ]; then
     exit 1
 fi
 
+if [ "$TARGET" = "kvmtool" ]; then
+    if [ -n "$ACCEL" ] && [ "$ACCEL" != "kvm" ]; then
+        echo "kvmtool supports only the kvm accelerator"
+        exit 1
+    fi
+fi
+
 only_tests=""
 args=`getopt -u -o ag:htj:v -l all,group:,help,tap13,parallel:,verbose -- $*`
 [ $? -ne 0 ] && exit 2;
-- 
2.32.0

_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

WARNING: multiple messages have this Message-ID (diff)
From: Alexandru Elisei <alexandru.elisei@arm.com>
To: drjones@redhat.com, thuth@redhat.com, pbonzini@redhat.com,
	lvivier@redhat.com, kvm-ppc@vger.kernel.org, david@redhat.com,
	frankja@linux.ibm.com, cohuck@redhat.com, imbrenda@linux.ibm.com,
	linux-s390@vger.kernel.org, kvm@vger.kernel.org,
	kvmarm@lists.cs.columbia.edu
Cc: andre.przywara@arm.com, maz@kernel.org, vivek.gautam@arm.com
Subject: [kvm-unit-tests RFC PATCH 3/5] run_tests.sh: Add kvmtool support
Date: Fri, 02 Jul 2021 16:31:20 +0000	[thread overview]
Message-ID: <20210702163122.96110-4-alexandru.elisei@arm.com> (raw)
In-Reply-To: <20210702163122.96110-1-alexandru.elisei@arm.com>

Modify run_tests.sh to use kvmtool instead of qemu to run tests when
kvm-unit-tests has been configured with --target=kvmtool.

Example invocation:

$ ./configure --target=kvmtool
$ make clean && make
$ ./run_scripts.sh

A custom location for the kvmtool binary can be set using the environment
variable KVMTOOL:

$ KVMTOOL=/path/to/kvmtool/binary ./run_scripts.sh

Standalone test support is absent, but will be added in subsequent patches.

Signed-off-by: Alexandru Elisei <alexandru.elisei@arm.com>
---
 scripts/arch-run.bash   |  48 ++++++++++++++++--
 scripts/runtime.bash    |  94 ++++++++++++++++++++++++++++------
 scripts/mkstandalone.sh |   5 ++
 arm/run                 | 110 ++++++++++++++++++++++++----------------
 run_tests.sh            |  11 +++-
 5 files changed, 204 insertions(+), 64 deletions(-)

diff --git a/scripts/arch-run.bash b/scripts/arch-run.bash
index 8ceed53ed7f8..b916b0e79aca 100644
--- a/scripts/arch-run.bash
+++ b/scripts/arch-run.bash
@@ -69,16 +69,39 @@ run_qemu ()
 	return $ret
 }
 
+run_kvmtool()
+{
+	local stdout errors ret sig
+
+	# kvmtool doesn't allow an initrd argument with --firmware, but configure
+	# sets CONFIG_ERRATA_FORCE in lib/config.h for the kvmtool target.
+
+	# stdout to {stdout}, stderr to $errors and stderr
+	exec {stdout}>&1
+	errors=$("${@}" </dev/null 2> >(tee /dev/stderr) > /dev/fd/$stdout)
+	ret=$?
+	exec {stdout}>&-
+
+	# ret=0 success, everything else is failure.
+	return $ret
+}
+
 run_test_status ()
 {
-	local stdout ret
+	local stdout ret exit_status
 
 	exec {stdout}>&1
-	lines=$(run_qemu "$@" > >(tee /dev/fd/$stdout))
+	if [ "$TARGET" = "kvmtool" ]; then
+		lines=$(run_kvmtool "$@" > >(tee /dev/fd/$stdout))
+		exit_status=0
+	else
+		lines=$(run_qemu "$@" > >(tee /dev/fd/$stdout))
+		exit_status=1
+	fi
 	ret=$?
 	exec {stdout}>&-
 
-	if [ $ret -eq 1 ]; then
+	if [ $ret -eq $exit_status ]; then
 		testret=$(grep '^EXIT: ' <<<"$lines" | sed 's/.*STATUS=\([0-9][0-9]*\).*/\1/')
 		if [ "$testret" ]; then
 			if [ $testret -eq 1 ]; then
@@ -193,6 +216,25 @@ search_qemu_binary ()
 	export PATH=$save_path
 }
 
+search_kvmtool_binary ()
+{
+	local lkvm kvmtool
+
+	for lkvm in ${KVMTOOL:-lkvm vm lkvm-static}; do
+		if $lkvm --help 2>/dev/null | grep -q 'The most commonly used'; then
+			kvmtool="$lkvm"
+			break
+		fi
+	done
+
+	if [ -z "$kvmtool" ]; then
+		echo "A kvmtool binary was not found." >&2
+		echo "You can set a custom location by using the KVMTOOL=<path> environment variable." >&2
+		return 2
+	fi
+	command -v $kvmtool
+}
+
 initrd_create ()
 {
 	if [ "$ENVIRON_DEFAULT" = "yes" ]; then
diff --git a/scripts/runtime.bash b/scripts/runtime.bash
index 132389c7dd59..23b238a6ab6f 100644
--- a/scripts/runtime.bash
+++ b/scripts/runtime.bash
@@ -12,14 +12,19 @@ extract_summary()
     tail -3 | grep '^SUMMARY: ' | sed 's/^SUMMARY: /(/;s/'"$cr"'\{0,1\}$/)/'
 }
 
-# We assume that QEMU is going to work if it tried to load the kernel
+# We assume that QEMU/kvmtool is going to work if it tried to load the kernel
 premature_failure()
 {
     local log="$(eval $(get_cmdline _NO_FILE_4Uhere_) 2>&1)"
 
-    echo "$log" | grep "_NO_FILE_4Uhere_" |
-        grep -q -e "could not \(load\|open\) kernel" -e "error loading" &&
-        return 1
+    if [ "$TARGET" = "kvmtool" ]; then
+        echo "$log" | grep "Fatal: unable to load firmware image _NO_FILE_4Uhere_" &&
+            return 1
+    else
+        echo "$log" | grep "_NO_FILE_4Uhere_" |
+            grep -q -e "could not \(load\|open\) kernel" -e "error loading" &&
+            return 1
+    fi
 
     RUNTIME_log_stderr <<< "$log"
 
@@ -30,7 +35,14 @@ premature_failure()
 get_cmdline()
 {
     local kernel=$1
-    echo "TESTNAME=$testname TIMEOUT=$timeout ACCEL=$accel $RUNTIME_arch_run $kernel -smp $smp $opts"
+    local smp_param
+
+    if [ "$TARGET" = "kvmtool" ]; then
+        smp_param="--cpus $smp"
+    else
+        smp_param="-smp $smp"
+    fi
+    echo "TESTNAME=$testname TIMEOUT=$timeout ACCEL=$accel $RUNTIME_arch_run $kernel $smp_param $opts"
 }
 
 skip_nodefault()
@@ -70,6 +82,35 @@ function find_word()
     grep -Fq " $1 " <<< " $2 "
 }
 
+fixup_kvmtool_opts()
+{
+    local opts=$1
+    local groups=$2
+    local gic
+    local gic_version
+
+    if find_word "pmu" $groups; then
+        opts+=" --pmu"
+    fi
+
+    if find_word "its" $groups; then
+        gic_version=3
+        gic="gicv3-its"
+    elif [[ "$opts" =~ -machine\ *gic-version=(2|3) ]]; then
+        gic_version="${BASH_REMATCH[1]}"
+        gic="gicv$gic_version"
+    fi
+
+    if [ -n "$gic" ]; then
+        opts=${opts/-machine gic-version=$gic_version/}
+        opts+=" --irqchip=$gic"
+    fi
+
+    opts=${opts/-append/--params}
+
+    echo "$opts"
+}
+
 function run()
 {
     local testname="$1"
@@ -105,7 +146,12 @@ function run()
         return 2
     fi
 
-    if [ -n "$accel" ] && [ -n "$ACCEL" ] && [ "$accel" != "$ACCEL" ]; then
+    if [ "$TARGET" = "kvmtool" ]; then
+        if [ -n "$accel" ] && [ "$accel" != "kvm" ]; then
+            print_result "SKIP" $testname "" "$accel not supported by kvmtool"
+            return 2
+        fi
+    elif [ -n "$accel" ] && [ -n "$ACCEL" ] && [ "$accel" != "$ACCEL" ]; then
         print_result "SKIP" $testname "" "$accel only, but ACCEL=$ACCEL"
         return 2
     elif [ -n "$ACCEL" ]; then
@@ -126,6 +172,10 @@ function run()
         done
     fi
 
+    if [ "$TARGET" = "kvmtool" ]; then
+        opts=$(fixup_kvmtool_opts "$opts" "$groups")
+    fi
+
     last_line=$(premature_failure > >(tail -1)) && {
         print_result "SKIP" $testname "" "$last_line"
         return 77
@@ -165,13 +215,25 @@ function run()
 #
 # Probe for MAX_SMP, in case it's less than the number of host cpus.
 #
-# This probing currently only works for ARM, as x86 bails on another
-# error first. Also, this probing isn't necessary for any ARM hosts
-# running kernels later than v4.3, i.e. those including ef748917b52
-# "arm/arm64: KVM: Remove 'config KVM_ARM_MAX_VCPUS'". So, at some
-# point when maintaining the while loop gets too tiresome, we can
-# just remove it...
-while $RUNTIME_arch_run _NO_FILE_4Uhere_ -smp $MAX_SMP \
-		|& grep -qi 'exceeds max CPUs'; do
-	MAX_SMP=$((MAX_SMP >> 1))
-done
+# This probing currently only works for ARM, as x86 bails on another error
+# first. Also, this probing isn't necessary for any ARM hosts running kernels
+# later than v4.3, i.e. those including ef748917b52 "arm/arm64: KVM: Remove
+# 'config KVM_ARM_MAX_VCPUS'". So, at some point when maintaining the while loop
+# gets too tiresome, we can just remove it...
+#
+# We don't need this check for kvmtool, as kvmtool will automatically limit the
+# number of VCPUs to what the host supports instead of exiting with an error.
+# kvmtool prints a message when that happens, but it's harmless and the chance
+# of running a kernel so old that the number of VCPUs is smaller than the number
+# of physical CPUs is vanishingly small.
+#
+# For qemu this check is still needed. For qemu-system-aarch64 version 6.0.0,
+# using TCG, the maximum number of VCPUs that mach-virt supports is 8. If a test
+# is running on a recent x86 machine, there's a fairly good chance that more
+# than 8 logical CPUs are available.
+if [ "$TARGET" = "qemu" ]; then
+    while $RUNTIME_arch_run _NO_FILE_4Uhere_ -smp $MAX_SMP \
+            |& grep -qi 'exceeds max CPUs'; do
+        MAX_SMP=$((MAX_SMP >> 1))
+    done
+fi
diff --git a/scripts/mkstandalone.sh b/scripts/mkstandalone.sh
index cefdec30cb33..16f461c06842 100755
--- a/scripts/mkstandalone.sh
+++ b/scripts/mkstandalone.sh
@@ -95,6 +95,11 @@ function mkstandalone()
 	echo Written $standalone.
 }
 
+if [ "$TARGET" = "kvmtool" ]; then
+	echo "Standalone tests not supported with kvmtool"
+	exit 2
+fi
+
 if [ "$ENVIRON_DEFAULT" = "yes" ] && [ "$ERRATATXT" ] && [ ! -f "$ERRATATXT" ]; then
 	echo "$ERRATATXT not found. (ERRATATXT=$ERRATATXT)" >&2
 	exit 2
diff --git a/arm/run b/arm/run
index a390ca5ae0ba..cc5890e7fec4 100755
--- a/arm/run
+++ b/arm/run
@@ -8,59 +8,81 @@ if [ -z "$STANDALONE" ]; then
 	source config.mak
 	source scripts/arch-run.bash
 fi
-processor="$PROCESSOR"
 
-ACCEL=$(get_qemu_accelerator) ||
-	exit $?
+run_test_qemu()
+{
+    processor="$PROCESSOR"
 
-qemu=$(search_qemu_binary) ||
-	exit $?
+    ACCEL=$(get_qemu_accelerator) ||
+        exit $?
 
-if ! $qemu -machine '?' 2>&1 | grep 'ARM Virtual Machine' > /dev/null; then
-	echo "$qemu doesn't support mach-virt ('-machine virt'). Exiting."
-	exit 2
-fi
+    qemu=$(search_qemu_binary) ||
+        exit $?
 
-M='-machine virt'
+    if ! $qemu -machine '?' 2>&1 | grep 'ARM Virtual Machine' > /dev/null; then
+        echo "$qemu doesn't support mach-virt ('-machine virt'). Exiting."
+        exit 2
+    fi
 
-if [ "$ACCEL" = "kvm" ]; then
-	if $qemu $M,\? 2>&1 | grep gic-version > /dev/null; then
-		M+=',gic-version=host'
-	fi
-	if [ "$HOST" = "aarch64" ] || [ "$HOST" = "arm" ]; then
-		processor="host"
-		if [ "$ARCH" = "arm" ] && [ "$HOST" = "aarch64" ]; then
-			processor+=",aarch64=off"
-		fi
-	fi
-fi
+    M='-machine virt'
 
-if [ "$ARCH" = "arm" ]; then
-	M+=",highmem=off"
-fi
+    if [ "$ACCEL" = "kvm" ]; then
+        if $qemu $M,\? 2>&1 | grep gic-version > /dev/null; then
+            M+=',gic-version=host'
+        fi
+        if [ "$HOST" = "aarch64" ] || [ "$HOST" = "arm" ]; then
+            processor="host"
+            if [ "$ARCH" = "arm" ] && [ "$HOST" = "aarch64" ]; then
+                processor+=",aarch64=off"
+            fi
+        fi
+    fi
 
-if ! $qemu $M -device '?' 2>&1 | grep virtconsole > /dev/null; then
-	echo "$qemu doesn't support virtio-console for chr-testdev. Exiting."
-	exit 2
-fi
+    if [ "$ARCH" = "arm" ]; then
+        M+=",highmem=off"
+    fi
 
-if $qemu $M -chardev testdev,id=id -initrd . 2>&1 \
-		| grep backend > /dev/null; then
-	echo "$qemu doesn't support chr-testdev. Exiting."
-	exit 2
-fi
+    if ! $qemu $M -device '?' 2>&1 | grep virtconsole > /dev/null; then
+        echo "$qemu doesn't support virtio-console for chr-testdev. Exiting."
+        exit 2
+    fi
 
-chr_testdev='-device virtio-serial-device'
-chr_testdev+=' -device virtconsole,chardev=ctd -chardev testdev,id=ctd'
+    if $qemu $M -chardev testdev,id=id -initrd . 2>&1 \
+            | grep backend > /dev/null; then
+        echo "$qemu doesn't support chr-testdev. Exiting."
+        exit 2
+    fi
 
-pci_testdev-if $qemu $M -device '?' 2>&1 | grep pci-testdev > /dev/null; then
-	pci_testdev="-device pci-testdev"
-fi
+    chr_testdev='-device virtio-serial-device'
+    chr_testdev+=' -device virtconsole,chardev=ctd -chardev testdev,id=ctd'
+
+    pci_testdev+    if $qemu $M -device '?' 2>&1 | grep pci-testdev > /dev/null; then
+        pci_testdev="-device pci-testdev"
+    fi
+
+    M+=",accel=$ACCEL"
+    command="$qemu -nodefaults $M -cpu $processor $chr_testdev $pci_testdev"
+    command+=" -display none -serial stdio -kernel"
+    command="$(migration_cmd) $(timeout_cmd) $command"
+
+    run_qemu $command "$@"
+}
+
+run_test_kvmtool()
+{
+    kvmtool=$(search_kvmtool_binary) ||
+        exit $?
 
-M+=",accel=$ACCEL"
-command="$qemu -nodefaults $M -cpu $processor $chr_testdev $pci_testdev"
-command+=" -display none -serial stdio -kernel"
-command="$(migration_cmd) $(timeout_cmd) $command"
+    local command="$(timeout_cmd) $kvmtool run --firmware "
+    run_test_status $command "$@"
+}
 
-run_qemu $command "$@"
+case "$TARGET" in
+    "qemu")
+        run_test_qemu "$@"
+        ;;
+    "kvmtool")
+        run_test_kvmtool "$@"
+        ;;
+esac
diff --git a/run_tests.sh b/run_tests.sh
index 65108e73a2c0..b010ee3ab348 100755
--- a/run_tests.sh
+++ b/run_tests.sh
@@ -26,7 +26,9 @@ Usage: $0 [-h] [-v] [-a] [-g group] [-j NUM-TASKS] [-t]
     -t, --tap13     Output test results in TAP format
 
 Set the environment variable QEMU=/path/to/qemu-system-ARCH to
-specify the appropriate qemu binary for ARCH-run.
+specify the appropriate qemu binary for ARCH-run. For arm/arm64, kvmtool
+is also supported and the environment variable KVMTOOL=/path/to/kvmtool
+can be used to specify a custom location for the kvmtool binary.
 
 EOF
 }
@@ -41,6 +43,13 @@ if [ $? -ne 4 ]; then
     exit 1
 fi
 
+if [ "$TARGET" = "kvmtool" ]; then
+    if [ -n "$ACCEL" ] && [ "$ACCEL" != "kvm" ]; then
+        echo "kvmtool supports only the kvm accelerator"
+        exit 1
+    fi
+fi
+
 only_tests=""
 args=`getopt -u -o ag:htj:v -l all,group:,help,tap13,parallel:,verbose -- $*`
 [ $? -ne 0 ] && exit 2;
-- 
2.32.0

  parent reply	other threads:[~2021-07-02 16:30 UTC|newest]

Thread overview: 108+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-02 16:31 [kvm-unit-tests RFC PATCH 0/5] arm: Add kvmtool to the runner script Alexandru Elisei
2021-07-02 16:31 ` Alexandru Elisei
2021-07-02 16:31 ` Alexandru Elisei
2021-07-02 16:31 ` [kvm-unit-tests RFC PATCH 1/5] lib: arm: Print test exit status on exit if chr-testdev is not available Alexandru Elisei
2021-07-02 16:31   ` [kvm-unit-tests RFC PATCH 1/5] lib: arm: Print test exit status on exit if chr-testdev is not availa Alexandru Elisei
2021-07-02 16:31   ` [kvm-unit-tests RFC PATCH 1/5] lib: arm: Print test exit status on exit if chr-testdev is not available Alexandru Elisei
2021-07-12 16:36   ` Andrew Jones
2021-07-12 16:36     ` [kvm-unit-tests RFC PATCH 1/5] lib: arm: Print test exit status on exit if chr-testdev is not av Andrew Jones
2021-07-12 16:36     ` [kvm-unit-tests RFC PATCH 1/5] lib: arm: Print test exit status on exit if chr-testdev is not available Andrew Jones
2021-09-06 10:20     ` Alexandru Elisei
2021-09-06 10:20       ` [kvm-unit-tests RFC PATCH 1/5] lib: arm: Print test exit status on exit if chr-testdev is not av Alexandru Elisei
2021-09-06 10:20       ` [kvm-unit-tests RFC PATCH 1/5] lib: arm: Print test exit status on exit if chr-testdev is not available Alexandru Elisei
2021-09-06 10:58       ` Andrew Jones
2021-09-06 10:58         ` [kvm-unit-tests RFC PATCH 1/5] lib: arm: Print test exit status on exit if chr-testdev is not av Andrew Jones
2021-09-06 10:58         ` [kvm-unit-tests RFC PATCH 1/5] lib: arm: Print test exit status on exit if chr-testdev is not available Andrew Jones
2021-09-06 11:06         ` Alexandru Elisei
2021-09-06 11:06           ` [kvm-unit-tests RFC PATCH 1/5] lib: arm: Print test exit status on exit if chr-testdev is not av Alexandru Elisei
2021-09-06 11:06           ` [kvm-unit-tests RFC PATCH 1/5] lib: arm: Print test exit status on exit if chr-testdev is not available Alexandru Elisei
2021-07-12 16:51   ` Andre Przywara
2021-07-12 16:51     ` [kvm-unit-tests RFC PATCH 1/5] lib: arm: Print test exit status on exit if chr-testdev is not av Andre Przywara
2021-07-12 16:51     ` [kvm-unit-tests RFC PATCH 1/5] lib: arm: Print test exit status on exit if chr-testdev is not available Andre Przywara
2021-07-12 17:07     ` Andrew Jones
2021-07-12 17:07       ` [kvm-unit-tests RFC PATCH 1/5] lib: arm: Print test exit status on exit if chr-testdev is not av Andrew Jones
2021-07-12 17:07       ` [kvm-unit-tests RFC PATCH 1/5] lib: arm: Print test exit status on exit if chr-testdev is not available Andrew Jones
2021-07-12 17:12       ` Nadav Amit
2021-07-12 17:12         ` [kvm-unit-tests RFC PATCH 1/5] lib: arm: Print test exit status on exit if chr-testdev is not av Nadav Amit
2021-07-12 17:12         ` [kvm-unit-tests RFC PATCH 1/5] lib: arm: Print test exit status on exit if chr-testdev is not available Nadav Amit
2021-07-02 16:31 ` [kvm-unit-tests RFC PATCH 2/5] scripts: Rename run_qemu_status -> run_test_status Alexandru Elisei
2021-07-02 16:31   ` Alexandru Elisei
2021-07-02 16:31   ` Alexandru Elisei
2021-07-12 16:37   ` Andrew Jones
2021-07-12 16:37     ` Andrew Jones
2021-07-12 16:37     ` Andrew Jones
2021-07-13  7:45   ` Thomas Huth
2021-07-13  7:45     ` Thomas Huth
2021-07-13  7:45     ` Thomas Huth
2021-07-02 16:31 ` Alexandru Elisei [this message]
2021-07-02 16:31   ` [kvm-unit-tests RFC PATCH 3/5] run_tests.sh: Add kvmtool support Alexandru Elisei
2021-07-02 16:31   ` Alexandru Elisei
2021-07-12 16:52   ` Andre Przywara
2021-07-12 16:52     ` Andre Przywara
2021-07-12 16:52     ` Andre Przywara
2021-09-06 10:28     ` Alexandru Elisei
2021-09-06 10:28       ` Alexandru Elisei
2021-09-06 10:28       ` Alexandru Elisei
2021-09-06 11:01       ` Andrew Jones
2021-09-06 11:01         ` Andrew Jones
2021-09-06 11:01         ` Andrew Jones
2021-09-06 11:07         ` Alexandru Elisei
2021-09-06 11:07           ` Alexandru Elisei
2021-09-06 11:07           ` Alexandru Elisei
2021-09-07 10:17   ` Andrew Jones
2021-09-07 10:17     ` Andrew Jones
2021-09-07 10:17     ` Andrew Jones
2021-09-08 14:33     ` Alexandru Elisei
2021-09-08 14:33       ` Alexandru Elisei
2021-09-08 14:33       ` Alexandru Elisei
2021-09-08 15:09       ` Andrew Jones
2021-09-08 15:09         ` Andrew Jones
2021-09-08 15:09         ` Andrew Jones
2021-09-08 15:46         ` Alexandru Elisei
2021-09-08 15:46           ` Alexandru Elisei
2021-09-08 15:46           ` Alexandru Elisei
2021-09-08 15:49           ` Andrew Jones
2021-09-08 15:49             ` Andrew Jones
2021-09-08 15:49             ` Andrew Jones
2021-09-09 11:33             ` Alexandru Elisei
2021-09-09 11:33               ` Alexandru Elisei
2021-09-09 11:33               ` Alexandru Elisei
2021-09-09 12:49               ` Andrew Jones
2021-09-09 12:49                 ` Andrew Jones
2021-09-09 12:49                 ` Andrew Jones
2021-07-02 16:31 ` [kvm-unit-tests RFC PATCH 4/5] scripts: Generate kvmtool standalone tests Alexandru Elisei
2021-07-02 16:31   ` Alexandru Elisei
2021-07-02 16:31   ` Alexandru Elisei
2021-09-07 10:21   ` Andrew Jones
2021-09-07 10:21     ` Andrew Jones
2021-09-07 10:21     ` Andrew Jones
2021-09-08 15:37     ` Alexandru Elisei
2021-09-08 15:37       ` Alexandru Elisei
2021-09-08 15:37       ` Alexandru Elisei
2021-09-08 16:07       ` Andrew Jones
2021-09-08 16:07         ` Andrew Jones
2021-09-08 16:07         ` Andrew Jones
2021-09-09 11:11         ` Alexandru Elisei
2021-09-09 11:11           ` Alexandru Elisei
2021-09-09 11:11           ` Alexandru Elisei
2021-09-09 13:05           ` Andrew Jones
2021-09-09 13:05             ` Andrew Jones
2021-09-09 13:05             ` Andrew Jones
2021-09-09 13:47             ` Alexandru Elisei
2021-09-09 13:47               ` Alexandru Elisei
2021-09-09 13:47               ` Alexandru Elisei
2021-09-09 13:54               ` Andrew Jones
2021-09-09 13:54                 ` Andrew Jones
2021-09-09 13:54                 ` Andrew Jones
2021-09-09 14:42                 ` Alexandru Elisei
2021-09-09 14:42                   ` Alexandru Elisei
2021-09-09 14:42                   ` Alexandru Elisei
2021-07-02 16:31 ` [kvm-unit-tests RFC PATCH 5/5] configure: Ignore --erratatxt when --target=kvmtool Alexandru Elisei
2021-07-02 16:31   ` Alexandru Elisei
2021-07-02 16:31   ` Alexandru Elisei
2021-09-07 10:25   ` Andrew Jones
2021-09-07 10:25     ` Andrew Jones
2021-09-07 10:25     ` Andrew Jones
2021-09-08 16:13     ` Alexandru Elisei
2021-09-08 16:13       ` Alexandru Elisei
2021-09-08 16:13       ` Alexandru Elisei

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210702163122.96110-4-alexandru.elisei@arm.com \
    --to=alexandru.elisei@arm.com \
    --cc=andre.przywara@arm.com \
    --cc=cohuck@redhat.com \
    --cc=david@redhat.com \
    --cc=drjones@redhat.com \
    --cc=frankja@linux.ibm.com \
    --cc=imbrenda@linux.ibm.com \
    --cc=kvm-ppc@vger.kernel.org \
    --cc=kvm@vger.kernel.org \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=linux-s390@vger.kernel.org \
    --cc=lvivier@redhat.com \
    --cc=maz@kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=thuth@redhat.com \
    --cc=vivek.gautam@arm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.