The current checks compare the env ACCEL to the unittests.conf provided accel. That's all fine as long as the user always specifies the ACCEL env variable. If that's not the case and KVM is not available or if a test specifies tcg and we start a qemu with the kvm acceleration as it's the default we'll run into problems. So let's fetch the accelerator before calling the arch/run script and check it against the test's specified accel. Yes, we now do that twice, once in the run_tests.sh and one in arch/run, but I don't think there's a good way around it since you can execute arch/run without run_tests.sh. Signed-off-by: Janosch Frank <frankja@xxxxxxxxxxxxx> --- run_tests.sh | 6 ++++ s390x/run | 6 +++- scripts/accel.bash | 63 +++++++++++++++++++++++++++++++++++++++++ scripts/arch-run.bash | 66 ++----------------------------------------- scripts/runtime.bash | 2 +- 5 files changed, 77 insertions(+), 66 deletions(-) create mode 100644 scripts/accel.bash diff --git a/run_tests.sh b/run_tests.sh index 65108e73..9ccb97bd 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -10,6 +10,7 @@ if [ ! -f config.mak ]; then fi source config.mak source scripts/common.bash +source scripts/accel.bash function usage() { @@ -164,6 +165,11 @@ if [[ $tap_output == "yes" ]]; then echo "TAP version 13" fi +qemu=$(search_qemu_binary) +if [ -z "$ACCEL" ]; then + ACCEL=$(get_qemu_accelerator) +fi + trap "wait; exit 130" SIGINT ( diff --git a/s390x/run b/s390x/run index 2ec6da70..df7ef5ca 100755 --- a/s390x/run +++ b/s390x/run @@ -12,8 +12,12 @@ fi qemu=$(search_qemu_binary) || exit $? -ACCEL=$(get_qemu_accelerator) || +if [ -z "$DEF_ACCEL "]; then + ACCEL=$(get_qemu_accelerator) || exit $? +else + ACCEL=$DEF_ACCEL +fi M='-machine s390-ccw-virtio' M+=",accel=$ACCEL" diff --git a/scripts/accel.bash b/scripts/accel.bash new file mode 100644 index 00000000..ea12412a --- /dev/null +++ b/scripts/accel.bash @@ -0,0 +1,63 @@ +search_qemu_binary () +{ + local save_path=$PATH + local qemucmd qemu + + export PATH=$PATH:/usr/libexec + for qemucmd in ${QEMU:-qemu-system-$ARCH_NAME qemu-kvm}; do + if $qemucmd --help 2>/dev/null | grep -q 'QEMU'; then + qemu="$qemucmd" + break + fi + done + + if [ -z "$qemu" ]; then + echo "A QEMU binary was not found." >&2 + echo "You can set a custom location by using the QEMU=<path> environment variable." >&2 + return 2 + fi + command -v $qemu + export PATH=$save_path +} + +kvm_available () +{ + if $($qemu -accel kvm 2> /dev/null); then + return 0; + else + return 1; + fi + + [ "$HOST" = "$ARCH_NAME" ] || + ( [ "$HOST" = aarch64 ] && [ "$ARCH" = arm ] ) || + ( [ "$HOST" = x86_64 ] && [ "$ARCH" = i386 ] ) +} + +hvf_available () +{ + [ "$(sysctl -n kern.hv_support 2>/dev/null)" = "1" ] || return 1 + [ "$HOST" = "$ARCH_NAME" ] || + ( [ "$HOST" = x86_64 ] && [ "$ARCH" = i386 ] ) +} + +get_qemu_accelerator () +{ + if [ "$ACCEL" = "kvm" ] && ! kvm_available; then + echo "KVM is needed, but not available on this host" >&2 + return 2 + fi + if [ "$ACCEL" = "hvf" ] && ! hvf_available; then + echo "HVF is needed, but not available on this host" >&2 + return 2 + fi + + if [ "$ACCEL" ]; then + echo $ACCEL + elif kvm_available; then + echo kvm + elif hvf_available; then + echo hvf + else + echo tcg + fi +} diff --git a/scripts/arch-run.bash b/scripts/arch-run.bash index 8cc9a61e..85c07792 100644 --- a/scripts/arch-run.bash +++ b/scripts/arch-run.bash @@ -24,6 +24,8 @@ # 1..127 - FAILURE (could be QEMU, a run script, or the unittest) # >= 128 - Signal (signum = status - 128) ############################################################################## +source scripts/accel.bash + run_qemu () { local stdout errors ret sig @@ -171,28 +173,6 @@ migration_cmd () fi } -search_qemu_binary () -{ - local save_path=$PATH - local qemucmd qemu - - export PATH=$PATH:/usr/libexec - for qemucmd in ${QEMU:-qemu-system-$ARCH_NAME qemu-kvm}; do - if $qemucmd --help 2>/dev/null | grep -q 'QEMU'; then - qemu="$qemucmd" - break - fi - done - - if [ -z "$qemu" ]; then - echo "A QEMU binary was not found." >&2 - echo "You can set a custom location by using the QEMU=<path> environment variable." >&2 - return 2 - fi - command -v $qemu - export PATH=$save_path -} - initrd_create () { if [ "$ENVIRON_DEFAULT" = "yes" ]; then @@ -339,45 +319,3 @@ trap_exit_push () local old_exit=$(trap -p EXIT | sed "s/^[^']*'//;s/'[^']*$//") trap -- "$1; $old_exit" EXIT } - -kvm_available () -{ - if $($qemu -accel kvm 2> /dev/null); then - return 0; - else - return 1; - fi - - [ "$HOST" = "$ARCH_NAME" ] || - ( [ "$HOST" = aarch64 ] && [ "$ARCH" = arm ] ) || - ( [ "$HOST" = x86_64 ] && [ "$ARCH" = i386 ] ) -} - -hvf_available () -{ - [ "$(sysctl -n kern.hv_support 2>/dev/null)" = "1" ] || return 1 - [ "$HOST" = "$ARCH_NAME" ] || - ( [ "$HOST" = x86_64 ] && [ "$ARCH" = i386 ] ) -} - -get_qemu_accelerator () -{ - if [ "$ACCEL" = "kvm" ] && ! kvm_available; then - echo "KVM is needed, but not available on this host" >&2 - return 2 - fi - if [ "$ACCEL" = "hvf" ] && ! hvf_available; then - echo "HVF is needed, but not available on this host" >&2 - return 2 - fi - - if [ "$ACCEL" ]; then - echo $ACCEL - elif kvm_available; then - echo kvm - elif hvf_available; then - echo hvf - else - echo tcg - fi -} diff --git a/scripts/runtime.bash b/scripts/runtime.bash index 132389c7..5d444db4 100644 --- a/scripts/runtime.bash +++ b/scripts/runtime.bash @@ -30,7 +30,7 @@ premature_failure() get_cmdline() { local kernel=$1 - echo "TESTNAME=$testname TIMEOUT=$timeout ACCEL=$accel $RUNTIME_arch_run $kernel -smp $smp $opts" + echo "TESTNAME=$testname TIMEOUT=$timeout DEF_ACCEL=$accel $RUNTIME_arch_run $kernel -smp $smp $opts" } skip_nodefault() -- 2.27.0