[libvirt] [PATCH RFC 4/8] qemu: hook up qemuCapsExtractVersionInfo

Lee Schermerhorn lee.schermerhorn at hp.com
Sun Mar 11 18:45:11 UTC 2012


Hook up qemuCapsExtractVersionInfo capabilities api to the emulator
cache framework by splitting into two parts:

  - qemuCapsExtractVersionInfo() looks up emulator in cache and
    returns the cached version and flags.  Cache look up may fill or
    refresh the cache.
  - wrap the part of the original qemuCapsExtractVersionInfo() with
    qemuCapsCacheVersionInfo() to run the specified binary and update
    the cached information for this binary.
---
 src/qemu/qemu_capabilities.c |   51 ++++++++++++++++++++++++++-----------------
 1 file changed, 32 insertions(+), 19 deletions(-)

Index: libvirt-0.9.10/src/qemu/qemu_capabilities.c
===================================================================
--- libvirt-0.9.10.orig/src/qemu/qemu_capabilities.c
+++ libvirt-0.9.10/src/qemu/qemu_capabilities.c
@@ -1498,16 +1498,37 @@ int qemuCapsExtractVersionInfo(const cha
                                unsigned int *retversion,
                                virBitmapPtr *retflags)
 {
+    qemuEmulatorCachePtr emulator;
+    int ret = -1;
+
+    emulator = qemuEmulatorCachedInfoGet(QEMU_PROBE_VERSION_INFO, qemu, arch);
+    if (emulator) {
+        if (retflags)
+            *retflags = virBitmapDup(emulator->caps);
+        if (retversion)
+           *retversion = emulator->version;
+        ret = 0;
+    } else {
+        if (retflags)
+            *retflags = 0;
+        if (retversion)
+            *retversion = 0;
+    }
+
+    qemuEmulatorCachedInfoRelease(emulator);
+    return ret;
+}
+
+static int
+qemuCapsCacheVersionInfo(qemuEmulatorCachePtr emulator)
+{
     int ret = -1;
     unsigned int version, is_kvm, kvm_version;
     virBitmapPtr flags = NULL;
     char *help = NULL;
+    char *qemu = emulator->path, *arch = emulator->arch;
     virCommandPtr cmd;
-
-    if (retflags)
-        *retflags = NULL;
-    if (retversion)
-        *retversion = 0;
+    VIR_DEBUG("Caching Version Info for %s - %s", qemu, arch ?: "no-arch");
 
     /* Make sure the binary we are about to try exec'ing exists.
      * Technically we could catch the exec() failure, but that's
@@ -1532,8 +1553,8 @@ int qemuCapsExtractVersionInfo(const cha
         goto cleanup;
 
     /* Currently only x86_64 and i686 support PCI-multibus. */
-    if (STREQLEN(arch, "x86_64", 6) ||
-        STREQLEN(arch, "i686", 4)) {
+    if (arch && (STREQLEN(arch, "x86_64", 6) ||
+                 STREQLEN(arch, "i686", 4))) {
         qemuCapsSet(flags, QEMU_CAPS_PCI_MULTIBUS);
     }
 
@@ -1544,12 +1565,10 @@ int qemuCapsExtractVersionInfo(const cha
         qemuCapsExtractDeviceStr(qemu, flags) < 0)
         goto cleanup;
 
-    if (retversion)
-        *retversion = version;
-    if (retflags) {
-        *retflags = flags;
-        flags = NULL;
-    }
+    emulator->version = version;
+    qemuCapsFree(emulator->caps);    /* for possible refresh */
+    emulator->caps = flags;
+    flags = NULL;
 
     ret = 0;
 
@@ -1561,12 +1580,6 @@ cleanup:
     return ret;
 }
 
-static int
-qemuCapsCacheVersionInfo(qemuEmulatorCachePtr emulator)
-{
-	return emulator ? 0 : 1;
-}
-
 static void
 uname_normalize (struct utsname *ut)
 {




More information about the libvir-list mailing list