[libvirt] [PATCH 1/2] qemu: Use common helper when probing qemu capabilities

Jiri Denemark jdenemar at redhat.com
Thu Apr 26 14:28:24 UTC 2012


QEMU binary is called several times when we probe different kinds of
capabilities the binary supports. This patch introduces new common
helper so that all probes use a consistent way of invoking qemu.
---
 src/qemu/qemu_capabilities.c |   59 ++++++++++++++++++++++++++---------------
 src/qemu/qemu_capabilities.h |    5 +++
 src/qemu/qemu_driver.c       |    9 +++++-
 3 files changed, 50 insertions(+), 23 deletions(-)

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 3d1fb43..6e5165b 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -289,6 +289,7 @@ qemuCapsParseMachineTypesStr(const char *output,
 
 int
 qemuCapsProbeMachineTypes(const char *binary,
+                          virBitmapPtr qemuCaps,
                           virCapsGuestMachinePtr **machines,
                           int *nmachines)
 {
@@ -306,10 +307,9 @@ qemuCapsProbeMachineTypes(const char *binary,
         return -1;
     }
 
-    cmd = virCommandNewArgList(binary, "-M", "?", NULL);
-    virCommandAddEnvPassCommon(cmd);
+    cmd = qemuCapsProbeCommand(binary, qemuCaps);
+    virCommandAddArgList(cmd, "-M", "?", NULL);
     virCommandSetOutputBuffer(cmd, &output);
-    virCommandClearCaps(cmd);
 
     /* Ignore failure from older qemu that did not understand '-M ?'.  */
     if (virCommandRun(cmd, &status) < 0)
@@ -599,12 +599,9 @@ qemuCapsProbeCPUModels(const char *qemu,
         return 0;
     }
 
-    cmd = virCommandNewArgList(qemu, "-cpu", "?", NULL);
-    if (qemuCapsGet(qemuCaps, QEMU_CAPS_NODEFCONFIG))
-        virCommandAddArg(cmd, "-nodefconfig");
-    virCommandAddEnvPassCommon(cmd);
+    cmd = qemuCapsProbeCommand(qemu, qemuCaps);
+    virCommandAddArgList(cmd, "-cpu", "?", NULL);
     virCommandSetOutputBuffer(cmd, &output);
-    virCommandClearCaps(cmd);
 
     if (virCommandRun(cmd, NULL) < 0)
         goto cleanup;
@@ -730,7 +727,8 @@ qemuCapsInitGuest(virCapsPtr caps,
                                             info->wordsize, binary, binary_mtime,
                                             old_caps, &machines, &nmachines);
         if (probe &&
-            qemuCapsProbeMachineTypes(binary, &machines, &nmachines) < 0)
+            qemuCapsProbeMachineTypes(binary, qemuCaps,
+                                      &machines, &nmachines) < 0)
             goto error;
     }
 
@@ -798,7 +796,8 @@ qemuCapsInitGuest(virCapsPtr caps,
                                                     kvmbin, binary_mtime,
                                                     old_caps, &machines, &nmachines);
                 if (probe &&
-                    qemuCapsProbeMachineTypes(kvmbin, &machines, &nmachines) < 0)
+                    qemuCapsProbeMachineTypes(kvmbin, qemuCaps,
+                                              &machines, &nmachines) < 0)
                     goto error;
             }
 
@@ -1366,17 +1365,16 @@ qemuCapsExtractDeviceStr(const char *qemu,
      * understand '-device name,?', and always exits with status 1 for
      * the simpler '-device ?', so this function is really only useful
      * if -help includes "device driver,?".  */
-    cmd = virCommandNewArgList(qemu,
-                               "-device", "?",
-                               "-device", "pci-assign,?",
-                               "-device", "virtio-blk-pci,?",
-                               "-device", "virtio-net-pci,?",
-                               "-device", "scsi-disk,?",
-                               NULL);
-    virCommandAddEnvPassCommon(cmd);
+    cmd = qemuCapsProbeCommand(qemu, flags);
+    virCommandAddArgList(cmd,
+                         "-device", "?",
+                         "-device", "pci-assign,?",
+                         "-device", "virtio-blk-pci,?",
+                         "-device", "virtio-net-pci,?",
+                         "-device", "scsi-disk,?",
+                         NULL);
     /* qemu -help goes to stdout, but qemu -device ? goes to stderr.  */
     virCommandSetErrorBuffer(cmd, &output);
-    virCommandClearCaps(cmd);
 
     if (virCommandRun(cmd, NULL) < 0)
         goto cleanup;
@@ -1485,10 +1483,9 @@ int qemuCapsExtractVersionInfo(const char *qemu, const char *arch,
         return -1;
     }
 
-    cmd = virCommandNewArgList(qemu, "-help", NULL);
-    virCommandAddEnvPassCommon(cmd);
+    cmd = qemuCapsProbeCommand(qemu, NULL);
+    virCommandAddArgList(cmd, "-help", NULL);
     virCommandSetOutputBuffer(cmd, &help);
-    virCommandClearCaps(cmd);
 
     if (virCommandRun(cmd, NULL) < 0)
         goto cleanup;
@@ -1628,3 +1625,21 @@ qemuCapsGet(virBitmapPtr caps,
     else
         return b;
 }
+
+
+virCommandPtr
+qemuCapsProbeCommand(const char *qemu,
+                     virBitmapPtr qemuCaps)
+{
+    virCommandPtr cmd = virCommandNew(qemu);
+
+    if (qemuCaps) {
+        if (qemuCapsGet(qemuCaps, QEMU_CAPS_NODEFCONFIG))
+            virCommandAddArg(cmd, "-nodefconfig");
+    }
+
+    virCommandAddEnvPassCommon(cmd);
+    virCommandClearCaps(cmd);
+
+    return cmd;
+}
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index 7279cdb..7a6c5a0 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -26,6 +26,7 @@
 
 # include "bitmap.h"
 # include "capabilities.h"
+# include "command.h"
 
 /* Internal flags to keep track of qemu command line capabilities */
 enum qemuCapsFlags {
@@ -150,6 +151,7 @@ bool qemuCapsGet(virBitmapPtr caps,
 virCapsPtr qemuCapsInit(virCapsPtr old_caps);
 
 int qemuCapsProbeMachineTypes(const char *binary,
+                              virBitmapPtr qemuCaps,
                               virCapsGuestMachinePtr **machines,
                               int *nmachines);
 
@@ -175,6 +177,9 @@ int qemuCapsParseHelpStr(const char *qemu,
 int qemuCapsParseDeviceStr(const char *str,
                            virBitmapPtr qemuCaps);
 
+virCommandPtr qemuCapsProbeCommand(const char *qemu,
+                                   virBitmapPtr qemuCaps);
+
 VIR_ENUM_DECL(qemuCaps);
 
 #endif /* __QEMU_CAPABILITIES_H__*/
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index c3555ca..bcc3947 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4867,7 +4867,14 @@ qemudCanonicalizeMachineDirect(virDomainDefPtr def, char **canonical)
     virCapsGuestMachinePtr *machines = NULL;
     int i, nmachines = 0;
 
-    if (qemuCapsProbeMachineTypes(def->emulator, &machines, &nmachines) < 0)
+    /* XXX we should be checking emulator capabilities and pass them instead
+     * of NULL so that -nodefconfig is properly added when
+     * probing machine types. Luckily, qemu does not support specifying new
+     * machine types in its configuration files yet, which means passing this
+     * additional parameter makes no difference now.
+     */
+    if (qemuCapsProbeMachineTypes(def->emulator, NULL,
+                                  &machines, &nmachines) < 0)
         return -1;
 
     for (i = 0; i < nmachines; i++) {
-- 
1.7.8.5




More information about the libvir-list mailing list