[fedora-virt-maint] rpms/libvirt/F-11 libvirt-0.6.2-detect-newer-qemu-kvm-versions.patch, NONE, 1.1 libvirt-0.6.2-refactor-qemu-version-parsing.patch, NONE, 1.1 libvirt-0.6.2-svirt-sound.patch, 1.4, 1.5 libvirt.spec, 1.141, 1.142

Mark McLoughlin markmc at fedoraproject.org
Wed Sep 30 14:20:16 UTC 2009


Author: markmc

Update of /cvs/pkgs/rpms/libvirt/F-11
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv25702

Modified Files:
	libvirt-0.6.2-svirt-sound.patch libvirt.spec 
Added Files:
	libvirt-0.6.2-detect-newer-qemu-kvm-versions.patch 
	libvirt-0.6.2-refactor-qemu-version-parsing.patch 
Log Message:
* Wed Sep 30 2009 Mark McLoughlin <markmc at redhat.com> - 0.6.2-18
- Fix qemu-kvm version detection so GSO is enabled for virtio_net (#526472)


libvirt-0.6.2-detect-newer-qemu-kvm-versions.patch:
 qemu_conf.c |   45 +++++++++++++++++++++++++++++++--------------
 1 file changed, 31 insertions(+), 14 deletions(-)

--- NEW FILE libvirt-0.6.2-detect-newer-qemu-kvm-versions.patch ---
>From fe3cb2edefceacc76d0dc9c98b8d3b677a495c32 Mon Sep 17 00:00:00 2001
From: Mark McLoughlin <markmc at 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 at 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


libvirt-0.6.2-refactor-qemu-version-parsing.patch:
 qemu_conf.c |  175 ++++++++++++++++++++++++++++++++++++++++++------------------
 1 file changed, 123 insertions(+), 52 deletions(-)

--- NEW FILE libvirt-0.6.2-refactor-qemu-version-parsing.patch ---
>From 266df161bfd87220bac68918613a2ce9323c8238 Mon Sep 17 00:00:00 2001
From: Mark McLoughlin <markmc at redhat.com>
Date: Thu, 11 Jun 2009 14:12:30 +0000
Subject: [PATCH] Re-factor qemu version parsing

This patch is purely re-factoring without any functional changes
to make way for the next patch.

The main thing achieved by the refactoring is that we now have
easier access to the parenthesised string that KVM folks seem
to delight in changing.

(cherry picked from commit 56ecebf22dd5a235503028e20bf936229037664b)

Signed-off-by: Mark McLoughlin <markmc at redhat.com>
Fedora-patch: libvirt-0.6.2-refactor-qemu-version-parsing.patch
---
 src/qemu_conf.c |  174 +++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 123 insertions(+), 51 deletions(-)

diff --git a/src/qemu_conf.c b/src/qemu_conf.c
index 1194e36..e488d74 100644
--- a/src/qemu_conf.c
+++ b/src/qemu_conf.c
@@ -414,54 +414,12 @@ virCapsPtr qemudCapsInit(void) {
     return NULL;
 }
 
-
-int qemudExtractVersionInfo(const char *qemu,
-                            unsigned int *retversion,
-                            unsigned int *retflags) {
-    const char *const qemuarg[] = { qemu, "-help", NULL };
-    const char *const qemuenv[] = { "LC_ALL=C", NULL };
-    pid_t child;
-    int newstdout = -1;
-    int ret = -1, status;
-    unsigned int major, minor, micro;
-    unsigned int version, kvm_version;
+static unsigned int qemudComputeCmdFlags(const char *help,
+                                         unsigned int version,
+                                         unsigned int kvm_version)
+{
     unsigned int flags = 0;
 
-    if (retflags)
-        *retflags = 0;
-    if (retversion)
-        *retversion = 0;
-
-    if (virExec(NULL, qemuarg, qemuenv, NULL,
-                &child, -1, &newstdout, NULL, VIR_EXEC_NONE) < 0)
-        return -1;
-
-    char *help = NULL;
-    enum { MAX_HELP_OUTPUT_SIZE = 1024*64 };
-    int len = virFileReadLimFD(newstdout, MAX_HELP_OUTPUT_SIZE, &help);
-    if (len < 0) {
-        virReportSystemError(NULL, errno, "%s",
-                             _("Unable to read QEMU help output"));
-        goto cleanup2;
-    }
-
-    if (sscanf(help, "QEMU PC emulator version %u.%u.%u (kvm-%u)",
-               &major, &minor, &micro, &kvm_version) != 4)
-        kvm_version = 0;
-
-    if (!kvm_version &&
-        sscanf(help, "QEMU PC emulator version %u.%u.%u",
-               &major, &minor, &micro) != 3) {
-        char *eol = strchr(help, '\n');
-        if (eol) *eol = '\0';
-        qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
-                         _("cannot parse QEMU version number in '%s'"),
-                         help);
-        goto cleanup2;
-    }
-
-    version = (major * 1000 * 1000) + (minor * 1000) + micro;
-
     if (strstr(help, "-no-kqemu"))
         flags |= QEMUD_CMD_FLAG_KQEMU;
     if (strstr(help, "-no-kvm"))
@@ -507,6 +465,125 @@ int qemudExtractVersionInfo(const char *qemu,
         flags |= QEMUD_CMD_FLAG_MIGRATE_QEMU_EXEC;
     }
 
+    return flags;
+}
+
+/* We parse the output of 'qemu -help' to get the QEMU
+ * 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.
+ */
+#define QEMU_VERSION_STR    "QEMU PC emulator version"
+#define KVM_VER_PREFIX      "(kvm-"
+
+#define SKIP_BLANKS(p) do { while ((*(p) == ' ') || (*(p) == '\t')) (p)++; } while (0)
+
+static int qemudParseHelpStr(const char *help,
+                             unsigned int *flags,
+                             unsigned int *version,
+                             unsigned int *kvm_version)
+{
+    unsigned major, minor, micro;
+    const char *p = help;
+
+    *flags = *version = *kvm_version = 0;
+
+    if (!STRPREFIX(p, QEMU_VERSION_STR))
+        goto fail;
+
+    p += strlen(QEMU_VERSION_STR);
+
+    SKIP_BLANKS(p);
+
+    major = virParseNumber(&p);
+    if (major == -1 || *p != '.')
+        goto fail;
+
+    ++p;
+
+    minor = virParseNumber(&p);
+    if (major == -1 || *p != '.')
+        goto fail;
+
+    ++p;
+
+    micro = virParseNumber(&p);
+    if (major == -1)
+        goto fail;
+
+    SKIP_BLANKS(p);
+
+    if (STRPREFIX(p, KVM_VER_PREFIX)) {
+        int ret;
+
+        p += strlen(KVM_VER_PREFIX);
+
+        ret = virParseNumber(&p);
+        if (ret == -1)
+            goto fail;
+
+        *kvm_version = ret;
+    }
+
+    *version = (major * 1000 * 1000) + (minor * 1000) + micro;
+
+    *flags = qemudComputeCmdFlags(help, *version, *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);
+
+    return 0;
+
+fail:
+    p = strchr(help, '\n');
+    if (p)
+        p = strndup(help, p - help);
+
+    qemudReportError(NULL, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
+                     _("cannot parse QEMU version number in '%s'"),
+                     p ? p : help);
+
+    VIR_FREE(p);
+
+    return -1;
+}
+
+int qemudExtractVersionInfo(const char *qemu,
+                            unsigned int *retversion,
+                            unsigned int *retflags) {
+    const char *const qemuarg[] = { qemu, "-help", NULL };
+    const char *const qemuenv[] = { "LC_ALL=C", NULL };
+    pid_t child;
+    int newstdout = -1;
+    int ret = -1, status;
+    unsigned int version, kvm_version;
+    unsigned int flags = 0;
+
+    if (retflags)
+        *retflags = 0;
+    if (retversion)
+        *retversion = 0;
+
+    if (virExec(NULL, qemuarg, qemuenv, NULL,
+                &child, -1, &newstdout, NULL, VIR_EXEC_NONE) < 0)
+        return -1;
+
+    char *help = NULL;
+    enum { MAX_HELP_OUTPUT_SIZE = 1024*64 };
+    int len = virFileReadLimFD(newstdout, MAX_HELP_OUTPUT_SIZE, &help);
+    if (len < 0) {
+        virReportSystemError(NULL, errno, "%s",
+                             _("Unable to read QEMU help output"));
+        goto cleanup2;
+    }
+
+    if (qemudParseHelpStr(help, &flags, &version, &kvm_version) == -1)
+        goto cleanup2;
+
     if (retversion)
         *retversion = version;
     if (retflags)
@@ -514,11 +591,6 @@ int qemudExtractVersionInfo(const char *qemu,
 
     ret = 0;
 
-    qemudDebug("Version %d %d %d  Cooked version: %d, with flags ? %d",
-               major, minor, micro, version, flags);
-    if (kvm_version)
-        qemudDebug("KVM version %d detected", kvm_version);
-
 cleanup2:
     VIR_FREE(help);
     if (close(newstdout) < 0)
-- 
1.6.2.5


libvirt-0.6.2-svirt-sound.patch:
 qemu_conf.c |   18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

Index: libvirt-0.6.2-svirt-sound.patch
===================================================================
RCS file: /cvs/pkgs/rpms/libvirt/F-11/libvirt-0.6.2-svirt-sound.patch,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -p -r1.4 -r1.5
--- libvirt-0.6.2-svirt-sound.patch	19 Aug 2009 17:08:59 -0000	1.4
+++ libvirt-0.6.2-svirt-sound.patch	30 Sep 2009 14:20:16 -0000	1.5
@@ -1,4 +1,4 @@
-From 0d72b6fb7d4aa5e55294eb3222e7156d3d75a9e7 Mon Sep 17 00:00:00 2001
+From 6096cb19d6b05707ca32f52b905c53818ecfc84b Mon Sep 17 00:00:00 2001
 From: Daniel P. Berrange <berrange at redhat.com>
 Date: Mon, 17 Aug 2009 08:52:30 +0100
 Subject: [PATCH] Disable sound cards when running sVirt
@@ -12,10 +12,10 @@ Fedora-patch: libvirt-0.6.2-svirt-sound.
  1 files changed, 16 insertions(+), 1 deletions(-)
 
 diff --git a/src/qemu_conf.c b/src/qemu_conf.c
-index 1194e36..f42aeaa 100644
+index d76b2b6..22c5363 100644
 --- a/src/qemu_conf.c
 +++ b/src/qemu_conf.c
-@@ -795,6 +795,20 @@ int qemudBuildCommandLine(virConnectPtr conn,
+@@ -885,6 +885,20 @@ int qemudBuildCommandLine(virConnectPtr conn,
      char domid[50];
      char *pidfile;
      const char *cpu = NULL;
@@ -36,7 +36,7 @@ index 1194e36..f42aeaa 100644
  
      uname_normalize(&ut);
  
-@@ -1441,7 +1455,8 @@ int qemudBuildCommandLine(virConnectPtr conn,
+@@ -1531,7 +1545,8 @@ int qemudBuildCommandLine(virConnectPtr conn,
      }
  
      /* Add sound hardware */


Index: libvirt.spec
===================================================================
RCS file: /cvs/pkgs/rpms/libvirt/F-11/libvirt.spec,v
retrieving revision 1.141
retrieving revision 1.142
diff -u -p -r1.141 -r1.142
--- libvirt.spec	21 Aug 2009 10:20:12 -0000	1.141
+++ libvirt.spec	30 Sep 2009 14:20:16 -0000	1.142
@@ -66,7 +66,7 @@
 Summary: Library providing a simple API virtualization
 Name: libvirt
 Version: 0.6.2
-Release: 17%{?dist}%{?extra_release}
+Release: 18%{?dist}%{?extra_release}
 License: LGPLv2+
 Group: Development/Libraries
 Source: http://libvirt.org/sources/libvirt-%{version}.tar.gz
@@ -134,6 +134,9 @@ Patch29: libvirt-allow-pci-hostdev-reset
 Patch30: libvirt-fix-migration-completion-with-newer-qemu.patch
 # Fix dumpxml segfault with newer versions of Xen (#518091)
 Patch31: libvirt-fix-xen-driver-segfault-with-newer-xen.patch
+# Fix qemu-kvm version detection so GSO is enabled
+Patch32: libvirt-0.6.2-refactor-qemu-version-parsing.patch
+Patch33: libvirt-0.6.2-detect-newer-qemu-kvm-versions.patch
 
 # Not for upstream. Temporary hack till PulseAudio autostart
 # problems are sorted out when SELinux enforcing
@@ -317,6 +320,8 @@ of recent versions of Linux (and other O
 %patch29 -p1
 %patch30 -p1
 %patch31 -p1
+%patch32 -p1
+%patch33 -p1
 
 %patch200 -p1
 
@@ -640,6 +645,9 @@ fi
 %endif
 
 %changelog
+* Wed Sep 30 2009 Mark McLoughlin <markmc at redhat.com> - 0.6.2-18
+- Fix qemu-kvm version detection so GSO is enabled for virtio_net (#526472)
+
 * Wed Aug 19 2009 Mark McLoughlin <markmc at redhat.com> - 0.6.2-17
 - Fix migration completion with newer versions of qemu (#516187)
 - Fix dumpxml segfault with newer versions of Xen (#518091)




More information about the Fedora-virt-maint mailing list