[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

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



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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]