kvmtool, unless told otherwise, will do its best to make sure that a kernel successfully boots in a virtual machine. It does things like automatically creating a rootfs and adding extra parameters to the kernel command line. This is actively harmful to kvm-unit-tests, because some tests parse the kernel command line and they will fail if they encounter the options added by kvmtool.
Fortunately for us, kvmtool commit 5613ae26b998 ("Add --nodefaults command line argument") addded the --nodefaults kvmtool parameter which disables all the implicit virtual machine configuration that cannot be disabled by using other parameters, like modifying the kernel command line. So always use --nodefaults to allow a test to run. kvmtool can also be too verbose when running a virtual machine, and this is controlled by several parameters. Add those to the default kvmtool command line to reduce this verbosity to a minimum. Before: $ vm run arm/selftest.flat --cpus 2 --mem 256 --params "setup smp=2 mem=256" Info: # lkvm run -k arm/selftest.flat -m 256 -c 2 --name guest-5035 Unknown subtest EXIT: STATUS=127 Warning: KVM compatibility warning. virtio-9p device was not detected. While you have requested a virtio-9p device, the guest kernel did not initialize it. Please make sure that the guest kernel was compiled with CONFIG_NET_9P_VIRTIO=y enabled in .config. Warning: KVM compatibility warning. virtio-net device was not detected. While you have requested a virtio-net device, the guest kernel did not initialize it. Please make sure that the guest kernel was compiled with CONFIG_VIRTIO_NET=y enabled in .config. Info: KVM session ended normally. After: $ vm run arm/selftest.flat --nodefaults --network mode=none --loglevel=warning --cpus 2 --mem 256 --params "setup smp=2 mem=256" PASS: selftest: setup: smp: number of CPUs matches expectation INFO: selftest: setup: smp: found 2 CPUs PASS: selftest: setup: mem: memory size matches expectation INFO: selftest: setup: mem: found 256 MB SUMMARY: 2 tests EXIT: STATUS=1 Note that KVMTOOL_DEFAULT_OPTS can be overwritten by an environment variable with the same name, but it's not documented in the help string for run_tests.sh. This has been done on purpose, since overwritting KVMTOOL_DEFAULT_OPTS should only be necessary for debugging or development purposes. Reviewed-by: Andrew Jones <andrew.jo...@linux.dev> Reviewed-by: Shaoqin Huang <shahu...@redhat.com> Signed-off-by: Alexandru Elisei <alexandru.eli...@arm.com> --- Changes v3->v4: * Use vmm_default_opts() instead of indexing into vmm_optname * Reworded the help test for --nodefaults as per Shaoqin's suggestion. scripts/common.bash | 6 +++--- scripts/vmm.bash | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/scripts/common.bash b/scripts/common.bash index 7c1b89f1b3c2..d5d3101c8089 100644 --- a/scripts/common.bash +++ b/scripts/common.bash @@ -37,7 +37,7 @@ function for_each_unittest() # -append as a kernel parameter instead of a command # line option. test_args="" - opts="" + opts="$(vmm_default_opts)" groups="" arch="" machine="" @@ -51,7 +51,7 @@ function for_each_unittest() elif [[ $line =~ ^test_args\ *=\ *(.*)$ ]]; then test_args="$(vmm_optname_args) ${BASH_REMATCH[1]}" elif [[ $line =~ ^$params_name\ *=\ *'"""'(.*)$ ]]; then - opts=${BASH_REMATCH[1]}$'\n' + opts="$(vmm_defaults_opts) ${BASH_REMATCH[1]}$'\n'" while read -r -u $fd; do #escape backslash newline, but not double backslash if [[ $opts =~ [^\\]*(\\*)$'\n'$ ]]; then @@ -67,7 +67,7 @@ function for_each_unittest() fi done elif [[ $line =~ ^$params_name\ *=\ *(.*)$ ]]; then - opts=${BASH_REMATCH[1]} + opts="$(vmm_default_opts) ${BASH_REMATCH[1]}" elif [[ $line =~ ^groups\ *=\ *(.*)$ ]]; then groups=${BASH_REMATCH[1]} elif [[ $line =~ ^arch\ *=\ *(.*)$ ]]; then diff --git a/scripts/vmm.bash b/scripts/vmm.bash index 0dd3f971ecdf..368690d62473 100644 --- a/scripts/vmm.bash +++ b/scripts/vmm.bash @@ -1,3 +1,14 @@ +# The following parameters are enabled by default when running a test with +# kvmtool: +# --nodefaults: suppress VM configuration that cannot be disabled (like +# modifying the supplied kernel command line). Otherwise tests +# that use the command line will fail without this parameter. +# --network mode=none: do not create a network device. kvmtool tries to help the +# user by automatically create one, and then prints a warning +# when the VM terminates if the device hasn't been initialized. +# --loglevel=warning: reduce verbosity +: "${KVMTOOL_DEFAULT_OPTS:="--nodefaults --network mode=none --loglevel=warning"}" + ############################################################################## # qemu_fixup_return_code translates the ambiguous exit status in Table1 to that # in Table2. Table3 simply documents the complete status table. @@ -82,11 +93,13 @@ function kvmtool_fixup_return_code() declare -A vmm_optname=( [qemu,args]='-append' + [qemu,default_opts]='' [qemu,fixup_return_code]=qemu_fixup_return_code [qemu,initrd]='-initrd' [qemu,nr_cpus]='-smp' [kvmtool,args]='--params' + [kvmtool,default_opts]="$KVMTOOL_DEFAULT_OPTS" [kvmtool,fixup_return_code]=kvmtool_fixup_return_code [kvmtool,initrd]='--initrd' [kvmtool,nr_cpus]='--cpus' @@ -97,6 +110,11 @@ function vmm_optname_args() echo ${vmm_optname[$(vmm_get_target),args]} } +function vmm_default_opts() +{ + echo ${vmm_optname[$(vmm_get_target),default_opts]} +} + function vmm_fixup_return_code() { ${vmm_optname[$(vmm_get_target),fixup_return_code]} "$@" -- 2.50.0