The KVM version string can be one of the following:
- qemu-kvm-x.y.z in stable releases
- kvm-XX for kvm versions up to kvm-85
- qemu-kvm-devel-XX for kvm version kvm-86 and later
There are only a few of places where we need to detect
differences between KVM versions based on 0.9.1:
1) VNET_HDR introduced in kvm-74
2) -incoming tcp introduced in kvm-79
3) -incoming exec introduced in kvm-80
4) -incoming stdio in all earlier kvm versions
With qemu-kvm-0.10.x, we can now assume that (1) is available
if it's a KVM release, (2) and (3) is always available and
(4) is never available.
So, from now on we should only need to check the qemu version
number and the "is_kvm" flag for detecting feature availability.
We only need the KVM version number for older releases.
Signed-off-by: Mark McLoughlin <markmc(a)redhat.com>
---
src/qemu_conf.c | 39 ++++++++++++++++++++++++++++-----------
1 files changed, 28 insertions(+), 11 deletions(-)
diff --git a/src/qemu_conf.c b/src/qemu_conf.c
index f6a8390..ea0d2f9 100644
--- a/src/qemu_conf.c
+++ b/src/qemu_conf.c
@@ -416,20 +416,30 @@ virCapsPtr qemudCapsInit(void) {
* version number. The first bit is easy, just parse
* 'QEMU PC emulator version x.y.z'.
*
- * With qemu-kvm, however, that is followed by a kvm-XX
- * string in parenthesis.
+ * With qemu-kvm, however, that is followed by a string
+ * in parenthesis as follows:
+ * - qemu-kvm-x.y.z in stable releases
+ * - kvm-XX for kvm versions up to kvm-85
+ * - qemu-kvm-devel-XX for kvm version kvm-86 and later
+ *
+ * For qemu-kvm versions before 0.10.z, we need to detect
+ * the KVM version number for some features. With 0.10.z
+ * and later, we just need the QEMU version number and
+ * whether it is KVM QEMU or mainline QEMU.
*/
#define QEMU_VERSION_STR "QEMU PC emulator version "
+#define QEMU_KVM_VER_PREFIX " (qemu-kvm-"
#define KVM_VER_PREFIX " (kvm-"
static int qemudParseVersionStr(const char *str,
unsigned int *version,
+ unsigned int *is_kvm,
unsigned int *kvm_version)
{
unsigned major, minor, micro;
const char *p = str;
- *version = *kvm_version = 0;
+ *version = *is_kvm = *kvm_version = 0;
if (!STRPREFIX(p, QEMU_VERSION_STR))
goto fail;
@@ -452,9 +462,13 @@ static int qemudParseVersionStr(const char *str,
if (major == -1)
goto fail;
- if (STRPREFIX(p, KVM_VER_PREFIX)) {
+ if (STRPREFIX(p, QEMU_KVM_VER_PREFIX)) {
+ *is_kvm = 1;
+ p += strlen(QEMU_KVM_VER_PREFIX);
+ } else if (STRPREFIX(p, KVM_VER_PREFIX)) {
int ret;
+ *is_kvm = 1;
p += strlen(KVM_VER_PREFIX);
ret = virParseNumber(&p);
@@ -470,6 +484,8 @@ static int qemudParseVersionStr(const char *str,
major, minor, micro, *version);
if (*kvm_version)
qemudDebug("KVM version %d detected", *kvm_version);
+ else if (*is_kvm)
+ qemudDebug("qemu-kvm version %d.%d.%d detected", major, minor, micro);
return 0;
@@ -488,7 +504,7 @@ int qemudExtractVersionInfo(const char *qemu,
pid_t child;
int newstdout = -1;
int ret = -1, status;
- unsigned int version, kvm_version;
+ unsigned int version, is_kvm, kvm_version;
unsigned int flags = 0;
if (retflags)
@@ -512,7 +528,7 @@ int qemudExtractVersionInfo(const char *qemu,
char *eol = strchr(help, '\n');
if (eol) *eol = '\0';
- if (qemudParseVersionStr(help, &version, &kvm_version) == -1)
+ if (qemudParseVersionStr(help, &version, &is_kvm, &kvm_version) == -1)
goto cleanup2;
if (strstr(help, "-no-kqemu"))
@@ -536,7 +552,8 @@ int qemudExtractVersionInfo(const char *qemu,
flags |= QEMUD_CMD_FLAG_DRIVE_BOOT;
if (version >= 9000)
flags |= QEMUD_CMD_FLAG_VNC_COLON;
- if (kvm_version >= 74)
+
+ if (is_kvm && (version >= 10000 || kvm_version >= 74))
flags |= QEMUD_CMD_FLAG_VNET_HDR;
/*
@@ -549,15 +566,15 @@ int qemudExtractVersionInfo(const char *qemu,
* was broken, because it blocked the monitor console
* while waiting for data, so pretend it doesn't exist
*/
- if (kvm_version >= 79) {
+ if (version >= 10000) {
+ flags |= QEMUD_CMD_FLAG_MIGRATE_QEMU_TCP;
+ flags |= QEMUD_CMD_FLAG_MIGRATE_QEMU_EXEC;
+ } else if (kvm_version >= 79) {
flags |= QEMUD_CMD_FLAG_MIGRATE_QEMU_TCP;
if (kvm_version >= 80)
flags |= QEMUD_CMD_FLAG_MIGRATE_QEMU_EXEC;
} else if (kvm_version > 0) {
flags |= QEMUD_CMD_FLAG_MIGRATE_KVM_STDIO;
- } else if (version >= 10000) {
- flags |= QEMUD_CMD_FLAG_MIGRATE_QEMU_TCP;
- flags |= QEMUD_CMD_FLAG_MIGRATE_QEMU_EXEC;
}
if (retversion)
--
1.6.0.6