]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Convert 'priv->dbusVMStateIds' to a GSList
authorPeter Krempa <pkrempa@redhat.com>
Fri, 5 Feb 2021 09:48:51 +0000 (10:48 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 11 Feb 2021 16:05:32 +0000 (17:05 +0100)
The conversion removes the use of virStringListAdd/virStringListRemove
which try to add dynamic properties to a string list which is really
inefficient.

Storing the dbus VMState ids in a GSList is pretty straightforward and
the slightly increased complexity of the code will be paid back by
removing the string list helpers later.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_command.c
src/qemu/qemu_dbus.c
src/qemu/qemu_dbus.h
src/qemu/qemu_domain.c
src/qemu/qemu_domain.h
src/qemu/qemu_migration.c
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c
src/qemu/qemu_monitor_json.h
src/qemu/qemu_slirp.c

index 6b6e0bfc343ff85142280151a3b3d805374ed910..d27d5eb55b2b5c82ece4b1f62970d1a76bd28c70 100644 (file)
@@ -9637,7 +9637,7 @@ qemuBuildDBusVMStateCommandLine(virCommandPtr cmd,
     g_autoptr(virJSONValue) props = NULL;
     qemuDomainObjPrivatePtr priv = QEMU_DOMAIN_PRIVATE(vm);
 
-    if (virStringListLength((const char **)priv->dbusVMStateIds) == 0)
+    if (!priv->dbusVMStateIds)
         return 0;
 
     if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DBUS_VMSTATE)) {
index ffcf83e5da515eddb72596be97cd292a7ec4ec7f..31ede2646fcfe42620280d98429fa80a05f0af6e 100644 (file)
@@ -287,15 +287,28 @@ qemuDBusStart(virQEMUDriverPtr driver,
 }
 
 
-int
+void
 qemuDBusVMStateAdd(virDomainObjPtr vm, const char *id)
 {
-    return virStringListAdd(&QEMU_DOMAIN_PRIVATE(vm)->dbusVMStateIds, id);
+    qemuDomainObjPrivatePtr priv = vm->privateData;
+
+    priv->dbusVMStateIds = g_slist_append(priv->dbusVMStateIds, g_strdup(id));
 }
 
 
 void
 qemuDBusVMStateRemove(virDomainObjPtr vm, const char *id)
 {
-    virStringListRemove(&QEMU_DOMAIN_PRIVATE(vm)->dbusVMStateIds, id);
+    qemuDomainObjPrivatePtr priv = vm->privateData;
+    GSList *next;
+
+    for (next = priv->dbusVMStateIds; next; next = next->next) {
+        const char *elem = next->data;
+
+        if (STREQ(id, elem)) {
+            priv->dbusVMStateIds = g_slist_remove_link(priv->dbusVMStateIds, next);
+            g_slist_free_full(next, g_free);
+            break;
+        }
+    }
 }
index e3ce1330fda2ce23f5352e9cf63534cc862ab438..5900b991446e279c1b2abfeeb81b24e3ab77ae5c 100644 (file)
@@ -30,7 +30,7 @@ int qemuDBusStart(virQEMUDriverPtr driver,
 void qemuDBusStop(virQEMUDriverPtr driver,
                   virDomainObjPtr vm);
 
-int qemuDBusVMStateAdd(virDomainObjPtr vm, const char *id);
+void qemuDBusVMStateAdd(virDomainObjPtr vm, const char *id);
 
 void qemuDBusVMStateRemove(virDomainObjPtr vm, const char *id);
 
index 53b4fb5f4f3db711700c973838ce1a7ca38af7f7..6243bf853f7b6771263d7621c0a5ca661d74eca1 100644 (file)
@@ -1785,8 +1785,8 @@ qemuDomainObjPrivateDataClear(qemuDomainObjPrivatePtr priv)
 
     priv->dbusDaemonRunning = false;
 
-    g_strfreev(priv->dbusVMStateIds);
-    priv->dbusVMStateIds = NULL;
+    if (priv->dbusVMStateIds)
+        g_slist_free_full(g_steal_pointer(&priv->dbusVMStateIds), g_free);
 
     priv->dbusVMState = false;
 
index 7453881a31baca76fa67c148ff729de495ed97c8..29a5dd97d8eded88af60e5508c94cced112179e9 100644 (file)
@@ -260,7 +260,7 @@ struct _qemuDomainObjPrivate {
     bool dbusDaemonRunning;
 
     /* list of Ids to migrate */
-    char **dbusVMStateIds;
+    GSList *dbusVMStateIds;
     /* true if -object dbus-vmstate was added */
     bool dbusVMState;
 
index f44d31c97122a436e5a85f69e9d706b9a4f84ab6..1bb4a9608ea660d3dcef3238673d7c2bbe6559f4 100644 (file)
@@ -1408,7 +1408,7 @@ qemuMigrationSrcIsAllowed(virQEMUDriverPtr driver,
             }
         }
 
-        if (virStringListLength((const char **)priv->dbusVMStateIds) > 0 &&
+        if (priv->dbusVMStateIds &&
             !virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DBUS_VMSTATE)) {
             virReportError(VIR_ERR_OPERATION_INVALID, "%s",
                            _("cannot migrate this domain without dbus-vmstate support"));
@@ -2091,8 +2091,7 @@ qemuMigrationDstRun(virQEMUDriverPtr driver,
     if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
         return -1;
 
-    rv = qemuMonitorSetDBusVMStateIdList(priv->mon,
-                                         (const char **)priv->dbusVMStateIds);
+    rv = qemuMonitorSetDBusVMStateIdList(priv->mon, priv->dbusVMStateIds);
     if (rv < 0)
         goto exit_monitor;
 
@@ -3602,7 +3601,7 @@ qemuMigrationSetDBusVMState(virQEMUDriverPtr driver,
 {
     qemuDomainObjPrivatePtr priv = vm->privateData;
 
-    if (virStringListLength((const char **)priv->dbusVMStateIds) > 0) {
+    if (priv->dbusVMStateIds) {
         int rv;
 
         if (qemuHotplugAttachDBusVMState(driver, vm, QEMU_ASYNC_JOB_NONE) < 0)
@@ -3611,8 +3610,7 @@ qemuMigrationSetDBusVMState(virQEMUDriverPtr driver,
         if (qemuDomainObjEnterMonitorAsync(driver, vm, QEMU_ASYNC_JOB_NONE) < 0)
             return -1;
 
-        rv = qemuMonitorSetDBusVMStateIdList(priv->mon,
-                                             (const char **)priv->dbusVMStateIds);
+        rv = qemuMonitorSetDBusVMStateIdList(priv->mon, priv->dbusVMStateIds);
 
         if (qemuDomainObjExitMonitor(driver, vm) < 0)
             rv = -1;
index 14966d4096312912f4d9eadf819ce59f1d5273c0..0476d606f553bd2c55b05a3b44afb65c27a2e370 100644 (file)
@@ -2385,21 +2385,28 @@ qemuMonitorSavePhysicalMemory(qemuMonitorPtr mon,
 
 int
 qemuMonitorSetDBusVMStateIdList(qemuMonitorPtr mon,
-                                const char **list)
+                                GSList *list)
 {
     g_autofree char *path = NULL;
+    g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
+    GSList *next;
 
     VIR_DEBUG("list=%p", list);
 
-    if (virStringListLength(list) == 0)
+    QEMU_CHECK_MONITOR(mon);
+
+    if (!list)
         return 0;
 
-    path = g_strdup_printf("/objects/%s",
-                           qemuDomainGetDBusVMStateAlias());
+    for (next = list; next; next = next->next)
+        virBufferAsprintf(&buf, "%s,", (const char *) next->data);
 
-    QEMU_CHECK_MONITOR(mon);
+    virBufferTrim(&buf, ",");
+
+    path = g_strdup_printf("/objects/%s", qemuDomainGetDBusVMStateAlias());
 
-    return qemuMonitorJSONSetDBusVMStateIdList(mon, path, list);
+    return qemuMonitorJSONSetDBusVMStateIdList(mon, path,
+                                               virBufferCurrentContent(&buf));
 }
 
 
index b0068f2a829c32304c7beffda2efbd76c0f9b0f1..32dc96ee825e66b36a2d8b86cfbd1c40499c1f7b 100644 (file)
@@ -777,7 +777,7 @@ int qemuMonitorSavePhysicalMemory(qemuMonitorPtr mon,
                                   const char *path);
 
 int qemuMonitorSetDBusVMStateIdList(qemuMonitorPtr mon,
-                                    const char **list);
+                                    GSList *list);
 
 int qemuMonitorSetMigrationSpeed(qemuMonitorPtr mon,
                                  unsigned long bandwidth);
index d3b2a2c7a5a1d4bd1d5a65b41d0fddcde0270f27..f8c78d909335f871e50cb915f9f9c52b9020ae4c 100644 (file)
@@ -2359,12 +2359,11 @@ qemuMonitorJSONSetMemoryStatsPeriod(qemuMonitorPtr mon,
 int
 qemuMonitorJSONSetDBusVMStateIdList(qemuMonitorPtr mon,
                                     const char *vmstatepath,
-                                    const char **list)
+                                    const char *idstr)
 {
-    g_autofree char *str = virStringListJoin(list, ",");
     qemuMonitorJSONObjectProperty prop = {
         .type = QEMU_MONITOR_OBJECT_PROPERTY_STRING,
-        .val.str = str,
+        .val.str = (char *) idstr,
     };
 
     return qemuMonitorJSONSetObjectProperty(mon, vmstatepath, "id-list", &prop);
index ba1531fee8d9b08ad474eeacf152d304388bdfe8..31652d4207183ad3d9611b71354d975c9ac33785 100644 (file)
@@ -699,7 +699,7 @@ qemuMonitorJSONTransactionBackup(virJSONValuePtr actions,
 
 int qemuMonitorJSONSetDBusVMStateIdList(qemuMonitorPtr mon,
                                         const char *vmstatepath,
-                                        const char **list)
+                                        const char *idstr)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
 
 int
index 62a666567981ab7d431efbbfd73c709495f94ba4..7f6156fbc180593d9d0bed697c3fffb7001448ce 100644 (file)
@@ -320,11 +320,8 @@ qemuSlirpStart(qemuSlirpPtr slirp,
         virCommandAddArgFormat(cmd, "--dbus-address=%s", dbus_addr);
 
         if (qemuSlirpHasFeature(slirp, QEMU_SLIRP_FEATURE_MIGRATE)) {
-            if (qemuDBusVMStateAdd(vm, id) < 0) {
-                virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                               _("Failed to register slirp migration"));
-                goto error;
-            }
+            qemuDBusVMStateAdd(vm, id);
+
             if (incoming)
                 virCommandAddArg(cmd, "--dbus-incoming");
         }