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(a)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