From: Richard W.M. Jones Date: Mon, 24 Oct 2011 12:24:16 +0000 (+0100) Subject: Add test for qemu broken -machine option (RHBZ#748266). X-Git-Tag: 1.8.14~4 X-Git-Url: http://git.annexia.org/?a=commitdiff_plain;h=0cfa174589c29c3155a03df07c858f2e7a3dcaba;p=libguestfs.git Add test for qemu broken -machine option (RHBZ#748266). Also add this option, if necessary, when testing for virtio-serial support. When the workaround is enabled, we specify machine type 'pc'. (cherry picked from commit 3814680423984b3c46c2f99e944c2a71862bde9f) --- diff --git a/configure.ac b/configure.ac index fbb46c3..9c3db6a 100644 --- a/configure.ac +++ b/configure.ac @@ -323,8 +323,53 @@ working. ]) fi + dnl qemu 0.15 was released with broken support for '-machine', + dnl requiring you to add the machine type: '-machine pc,[...]'. + dnl The problem is that 'pc' is only applicable for PC-like + dnl hardware, so we cannot do this as a general solution. Since + dnl qemu 0.15, this problem has been fixed so now the default + dnl machine type is chosen (qemu commit 2645c6dcaf6ea2a51a). + dnl + dnl We need to work out if this qemu is the broken version, so we + dnl can add 'pc' just for this broken version. + dnl + dnl Note that old qemu didn't support the '-machine' option at all. + dnl + dnl We use the -kernel option for testing this, because this option + dnl is processed very late, after qemu has set up the machine. + AC_MSG_CHECKING([for broken '-machine accel=tcg' option in $QEMU]) + LC_ALL=C $QEMU -nographic -machine accel=tcg -kernel /NO_SUCH_FILE \ + > config1.tmp 2>&1 + LC_ALL=C $QEMU -nographic -machine pc,accel=tcg -kernel /NO_SUCH_FILE \ + > config2.tmp 2>&1 + if cmp -s config1.tmp config2.tmp; then + AC_MSG_RESULT([no]) + else + AC_MSG_RESULT([yes]) + AC_DEFINE([QEMU_MACHINE_TYPE_IS_BROKEN],[1],[qemu -machine accel=tcg option is broken (in qemu 0.15 only)]) + fi + rm config1.tmp config2.tmp + + dnl See if the '-machine [pc,]accel=tcg' option is required in + dnl order to run the virtio-serial test below. This happens when + dnl we run qemu-kvm inside a VM without forcing TCG: + dnl + dnl Could not access KVM kernel module: No such file or directory + dnl failed to initialize KVM: No such file or directory + dnl No accelerator found! + AC_MSG_CHECKING([if -machine @<:@pc,@:>@accel=tcg option is required to test virtio-serial feature]) + if $QEMU -nographic -device \? >/dev/null 2>&1; then + : + elif $QEMU -machine accel=tcg -nographic -device \? >/dev/null 2>&1; then + QEMU_EXTRA_OPTIONS_FOR_TEST="-machine accel=tcg" + elif $QEMU -machine pc,accel=tcg -nographic -device \? >/dev/null 2>&1; then + QEMU_EXTRA_OPTIONS_FOR_TEST="-machine pc,accel=tcg" + # else nothing ... it'll fail below. + fi + AC_MSG_RESULT([$QEMU_EXTRA_OPTIONS_FOR_TEST]) + AC_MSG_CHECKING([for virtio-serial support in $QEMU]) - if $QEMU -nographic -device \? 2>&1 | grep -sq virtio-serial; then + if $QEMU $QEMU_EXTRA_OPTIONS_FOR_TEST -nographic -device \? 2>&1 | grep -sq virtio-serial; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) diff --git a/src/launch.c b/src/launch.c index 4981d6f..34d0950 100644 --- a/src/launch.c +++ b/src/launch.c @@ -473,21 +473,38 @@ launch_appliance (guestfs_h *g) if (qemu_supports (g, "-nodefconfig")) add_cmdline (g, "-nodefconfig"); - /* qemu sometimes needs this option to enable hardware - * virtualization, but some versions of 'qemu-kvm' will use KVM - * regardless (even where this option appears in the help text). - * It is rumoured that there are versions of qemu where supplying - * this option when hardware virtualization is not available will - * cause qemu to fail, so we we have to check at least that - * /dev/kvm is openable. That's not reliable, since /dev/kvm - * might be openable by qemu but not by us (think: SELinux) in - * which case the user would not get hardware virtualization, - * although at least shouldn't fail. A giant clusterfuck with the - * qemu command line, again. - */ - if (qemu_supports (g, "-enable-kvm") && - is_openable (g, "/dev/kvm", O_RDWR)) - add_cmdline (g, "-enable-kvm"); + if (qemu_supports (g, "-machine")) { + add_cmdline (g, "-machine"); +#if QEMU_MACHINE_TYPE_IS_BROKEN + /* Workaround for qemu 0.15: We have to add the '[type=]pc' + * since there is no default. This is not a permanent solution + * because this only works on PC-like hardware. Other platforms + * like ppc would need a different machine type. + * + * This bug is fixed in qemu commit 2645c6dcaf6ea2a51a, and was + * not a problem in qemu < 0.15. + */ + add_cmdline (g, "pc,accel=kvm:tcg"); +#else + add_cmdline (g, "accel=kvm:tcg"); +#endif + } else { + /* qemu sometimes needs this option to enable hardware + * virtualization, but some versions of 'qemu-kvm' will use KVM + * regardless (even where this option appears in the help text). + * It is rumoured that there are versions of qemu where supplying + * this option when hardware virtualization is not available will + * cause qemu to fail, so we we have to check at least that + * /dev/kvm is openable. That's not reliable, since /dev/kvm + * might be openable by qemu but not by us (think: SELinux) in + * which case the user would not get hardware virtualization, + * although at least shouldn't fail. A giant clusterfuck with the + * qemu command line, again. + */ + if (qemu_supports (g, "-enable-kvm") && + is_openable (g, "/dev/kvm", O_RDWR)) + add_cmdline (g, "-enable-kvm"); + } /* Newer versions of qemu (from around 2009/12) changed the * behaviour of monitors so that an implicit '-monitor stdio' is