This patch fixes building a command-line for QEMU machines without KVM
acceleration and is based on following assumptions:
- QEMU_CAPS_KVM flag means that QEMU is capable of running KVM
accelerated machine (not that it knows about KVM at all, even
though there is probably no QEMU that knows about KVM and isn't
able to use it). It is not actually true for the past (it meant
that QEMU has '-no-kvm' option, that it doesn't always know), but
we can say this is what it means from now on without any harm being
done.
- QEMU_CAPS_ENABLE_KVM flag means that QEMU is, by default, running
without KVM acceleration and in case we need KVM acceleration it
needs to be explicitely instructed to do so. This is partially
true for the past (this option essentially means that QEMU
recognizes the '-enable-kvm' option, even though it's almost the
same).
---
src/qemu/qemu_capabilities.c | 16 ++++++++++++----
src/qemu/qemu_command.c | 6 ++++--
2 files changed, 16 insertions(+), 6 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index fe462e9..a19d833 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -2039,9 +2039,18 @@ qemuCapsProbeQMPKVMState(qemuCapsPtr caps,
if (qemuMonitorGetKVMState(mon, &enabled, &present) < 0)
return -1;
- /* Youre right, this code does nothing, you must have checked out
- * some weird commit. Go back to your room and think about what
- * you've done, young (wo)man. */
+ if (!present) {
+ /* When KVM is not present, the flag shouldn't be set, but it
+ * was set earlier when we discovered that QEMU is capable of
+ * "query-kvm" QMP command (which doesn't mean anything,
+ * essentially). So let's fix that. */
+ qemuCapsClear(caps, QEMU_CAPS_KVM);
+ } else if (!enabled) {
+ /* We shouldn't use -enable-kvm when kvm is enabled by
+ * default, but more importantly, we should be able to know
+ * when not using it launches a software emulated machine. */
+ qemuCapsSet(caps, QEMU_CAPS_ENABLE_KVM);
+ }
return 0;
}
@@ -2177,7 +2186,6 @@ qemuCapsInitQMPBasic(qemuCapsPtr caps)
qemuCapsSet(caps, QEMU_CAPS_DRIVE_SERIAL);
qemuCapsSet(caps, QEMU_CAPS_MIGRATE_QEMU_UNIX);
qemuCapsSet(caps, QEMU_CAPS_CHARDEV);
- qemuCapsSet(caps, QEMU_CAPS_ENABLE_KVM);
qemuCapsSet(caps, QEMU_CAPS_MONITOR_JSON);
qemuCapsSet(caps, QEMU_CAPS_BALLOON);
qemuCapsSet(caps, QEMU_CAPS_DEVICE);
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 898c4c0..2f863d3 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -4466,12 +4466,14 @@ qemuBuildCommandLine(virConnectPtr conn,
case VIR_DOMAIN_VIRT_QEMU:
if (qemuCapsGet(caps, QEMU_CAPS_KQEMU))
disableKQEMU = 1;
- if (qemuCapsGet(caps, QEMU_CAPS_KVM))
+ if (qemuCapsGet(caps, QEMU_CAPS_KVM) &&
+ !qemuCapsGet(caps, QEMU_CAPS_ENABLE_KVM))
disableKVM = 1;
break;
case VIR_DOMAIN_VIRT_KQEMU:
- if (qemuCapsGet(caps, QEMU_CAPS_KVM))
+ if (qemuCapsGet(caps, QEMU_CAPS_KVM) &&
+ !qemuCapsGet(caps, QEMU_CAPS_ENABLE_KVM))
disableKVM = 1;
if (qemuCapsGet(caps, QEMU_CAPS_ENABLE_KQEMU)) {
--
1.7.12.4