[libvirt] [PATCH] qemu_monitor_json: add support to search QOM device path by device alias

Pavel Hrdina phrdina at redhat.com
Mon Jul 25 14:06:15 UTC 2016


On Mon, Jul 25, 2016 at 03:51:49PM +0200, Martin Kletzander wrote:
> On Mon, Jul 25, 2016 at 02:41:01PM +0200, Pavel Hrdina wrote:
> >Commit ce745914 introduced detection of actual video ram sizes to fix migration
> >if QEMU decide to modify the values provided by libvirt.  This works perfectly
> >for domains with number of video devices up to two.
> >
> >If there are more than two video devices in the guest all the secondary devices
> >in the XML will have the same memory values.  This is because our current code
> >search for QOM device path only by the device type name and all the secondary
> >video devices has the same name "qxl".
> >
> >This patch introduces a new search function that will try to search a QOM device
> >path using also device's alias if the alias is available. After that it will
> >fallback to the old recursive code if the alias search found no results.
> >
> >Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1358728
> >
> >Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
> >---
> > src/qemu/qemu_monitor.c      | 11 ++++---
> > src/qemu/qemu_monitor_json.c | 74 ++++++++++++++++++++++++++++++++++++++------
> > src/qemu/qemu_monitor_json.h |  3 +-
> > 3 files changed, 74 insertions(+), 14 deletions(-)
> >
> >diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
> >index 098e654..1fac4de 100644
> >--- a/src/qemu/qemu_monitor.c
> >+++ b/src/qemu/qemu_monitor.c
> >@@ -1084,10 +1084,11 @@ qemuMonitorInitBalloonObjectPath(qemuMonitorPtr mon)
> >     }
> >     mon->ballooninit = true;
> >
> >-    flp_ret = qemuMonitorJSONFindLinkPath(mon, "virtio-balloon-pci", &path);
> >+    flp_ret = qemuMonitorJSONFindLinkPath(mon, "virtio-balloon-pci", NULL, &path);
> >     if (flp_ret == -2) {
> >         /* pci object was not found retry search for ccw object */
> >-        if (qemuMonitorJSONFindLinkPath(mon, "virtio-balloon-ccw", &path) < 0)
> >+        if (qemuMonitorJSONFindLinkPath(mon, "virtio-balloon-ccw",
> >+                                        NULL, &path) < 0)
> 
> We could pass the balloon alias here through all the functions, right?
> Although it will be literally 'balloon0' every single time there is any,
> so maybe we could use that.

Somehow I assumed that balloon device doesn't have an alias.  Sure this would be
better and I'll post it as followup.

> >diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
> >index bb426dc..5d24e26 100644
> >--- a/src/qemu/qemu_monitor_json.c
> >+++ b/src/qemu/qemu_monitor_json.c
> >@@ -6810,7 +6810,55 @@ qemuMonitorJSONGetMemoryDeviceInfo(qemuMonitorPtr mon,
> >
> >
> > /**
> >- * Recursively search for a QOM object link.
> >+ * Search for a QOM object link by alias and name.
> >+ *
> >+ * For @alias and @name, this function tries to find QOM object named @name
> >+ * with id @alias in /machine/peripheral.
> >+ *
> >+ * Returns:
> >+ *   0  - Found
> >+ *  -1  - Error - bail out
> >+ *  -2  - Not found
> >+ */
> >+static int
> >+qemuMonitorJSONFindObjectPathByAlias(qemuMonitorPtr mon,
> >+                                     const char *name,
> >+                                     const char *alias,
> >+                                     char **path)
> >+{
> >+    qemuMonitorJSONListPathPtr *paths = NULL;
> >+    char *child = NULL;
> >+    int npaths;
> >+    int ret = -1;
> >+    size_t i;
> >+
> >+    npaths = qemuMonitorJSONGetObjectListPaths(mon, "/machine/peripheral", &paths);
> >+    if (npaths < 0)
> >+        return -1;
> >+
> >+    if (virAsprintf(&child, "child<%s>", name) < 0)
> >+        return -1;
> >+
> >+    for (i = 0; i < npaths; i++) {
> >+        if (STREQ(paths[i]->name, alias) && STREQ(paths[i]->type, child)) {
> >+            if (virAsprintf(path, "/machine/peripheral/%s", alias) < 0)
> >+                goto cleanup;
> >+
> >+            ret = 0;
> >+            goto cleanup;
> >+        }
> >+    }
> >+
> >+    ret = -2;
> >+
> >+ cleanup:
> >+    VIR_FREE(child);
> >+    return ret;
> >+}
> >+
> 
> You are missing qemuMonitorJSONListPathFree() here (and also the returns
> above need to be fixed).
> 
> ACK with that fixed.

I knew that I've missed something, thanks.

Pavel




More information about the libvir-list mailing list