171 lines
5.9 KiB
Diff
171 lines
5.9 KiB
Diff
|
From fe3cb2edefceacc76d0dc9c98b8d3b677a495c32 Mon Sep 17 00:00:00 2001
|
||
|
From: Mark McLoughlin <markmc@redhat.com>
|
||
|
Date: Thu, 11 Jun 2009 14:15:49 +0000
|
||
|
Subject: [PATCH] Detect newer qemu-kvm versions
|
||
|
|
||
|
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.
|
||
|
|
||
|
(cherry picked from commit 04cbe687974b3b46c96fa20180bbb07ffeff69da)
|
||
|
|
||
|
Signed-off-by: Mark McLoughlin <markmc@redhat.com>
|
||
|
Fedora-patch: libvirt-0.6.2-detect-newer-qemu-kvm-versions.patch
|
||
|
---
|
||
|
src/qemu_conf.c | 44 +++++++++++++++++++++++++++++++-------------
|
||
|
1 files changed, 31 insertions(+), 13 deletions(-)
|
||
|
|
||
|
diff --git a/src/qemu_conf.c b/src/qemu_conf.c
|
||
|
index e488d74..d76b2b6 100644
|
||
|
--- a/src/qemu_conf.c
|
||
|
+++ b/src/qemu_conf.c
|
||
|
@@ -416,6 +416,7 @@ virCapsPtr qemudCapsInit(void) {
|
||
|
|
||
|
static unsigned int qemudComputeCmdFlags(const char *help,
|
||
|
unsigned int version,
|
||
|
+ unsigned int is_kvm,
|
||
|
unsigned int kvm_version)
|
||
|
{
|
||
|
unsigned int flags = 0;
|
||
|
@@ -441,7 +442,8 @@ static unsigned int qemudComputeCmdFlags(const char *help,
|
||
|
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;
|
||
|
|
||
|
/*
|
||
|
@@ -454,15 +456,15 @@ static unsigned int qemudComputeCmdFlags(const char *help,
|
||
|
* 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;
|
||
|
}
|
||
|
|
||
|
return flags;
|
||
|
@@ -472,10 +474,19 @@ static unsigned int qemudComputeCmdFlags(const char *help,
|
||
|
* 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-"
|
||
|
|
||
|
#define SKIP_BLANKS(p) do { while ((*(p) == ' ') || (*(p) == '\t')) (p)++; } while (0)
|
||
|
@@ -483,12 +494,13 @@ static unsigned int qemudComputeCmdFlags(const char *help,
|
||
|
static int qemudParseHelpStr(const char *help,
|
||
|
unsigned int *flags,
|
||
|
unsigned int *version,
|
||
|
+ unsigned int *is_kvm,
|
||
|
unsigned int *kvm_version)
|
||
|
{
|
||
|
unsigned major, minor, micro;
|
||
|
const char *p = help;
|
||
|
|
||
|
- *flags = *version = *kvm_version = 0;
|
||
|
+ *flags = *version = *is_kvm = *kvm_version = 0;
|
||
|
|
||
|
if (!STRPREFIX(p, QEMU_VERSION_STR))
|
||
|
goto fail;
|
||
|
@@ -515,9 +527,13 @@ static int qemudParseHelpStr(const char *help,
|
||
|
|
||
|
SKIP_BLANKS(p);
|
||
|
|
||
|
- 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);
|
||
|
@@ -529,12 +545,14 @@ static int qemudParseHelpStr(const char *help,
|
||
|
|
||
|
*version = (major * 1000 * 1000) + (minor * 1000) + micro;
|
||
|
|
||
|
- *flags = qemudComputeCmdFlags(help, *version, *kvm_version);
|
||
|
+ *flags = qemudComputeCmdFlags(help, *version, *is_kvm, *kvm_version);
|
||
|
|
||
|
qemudDebug("Version %u.%u.%u, cooked version %u, flags %u",
|
||
|
major, minor, micro, *version, *flags);
|
||
|
if (*kvm_version)
|
||
|
- qemudDebug("KVM version %u detected", *kvm_version);
|
||
|
+ qemudDebug("KVM version %d detected", *kvm_version);
|
||
|
+ else if (*is_kvm)
|
||
|
+ qemudDebug("qemu-kvm version %u.%u.%u detected", major, minor, micro);
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
@@ -560,7 +578,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)
|
||
|
@@ -581,7 +599,7 @@ int qemudExtractVersionInfo(const char *qemu,
|
||
|
goto cleanup2;
|
||
|
}
|
||
|
|
||
|
- if (qemudParseHelpStr(help, &flags, &version, &kvm_version) == -1)
|
||
|
+ if (qemudParseHelpStr(help, &flags, &version, &is_kvm, &kvm_version) == -1)
|
||
|
goto cleanup2;
|
||
|
|
||
|
if (retversion)
|
||
|
--
|
||
|
1.6.2.5
|
||
|
|