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(a)redhat.com>
---
src/qemu/qemu_command.c | 2 +-
src/qemu/qemu_dbus.c | 19 ++++++++++++++++---
src/qemu/qemu_dbus.h | 2 +-
src/qemu/qemu_domain.c | 4 ++--
src/qemu/qemu_domain.h | 2 +-
src/qemu/qemu_migration.c | 10 ++++------
src/qemu/qemu_monitor.c | 19 +++++++++++++------
src/qemu/qemu_monitor.h | 2 +-
src/qemu/qemu_monitor_json.c | 5 ++---
src/qemu/qemu_monitor_json.h | 2 +-
src/qemu/qemu_slirp.c | 7 ++-----
11 files changed, 44 insertions(+), 30 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 92036d26c0..ac6bec3389 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -9605,7 +9605,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)) {
diff --git a/src/qemu/qemu_dbus.c b/src/qemu/qemu_dbus.c
index ffcf83e5da..31ede2646f 100644
--- a/src/qemu/qemu_dbus.c
+++ b/src/qemu/qemu_dbus.c
@@ -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;
+ }
+ }
}
diff --git a/src/qemu/qemu_dbus.h b/src/qemu/qemu_dbus.h
index e3ce1330fd..5900b99144 100644
--- a/src/qemu/qemu_dbus.h
+++ b/src/qemu/qemu_dbus.h
@@ -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);
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 0f09e321fb..31b1110887 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -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;
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 7453881a31..29a5dd97d8 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -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;
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index f44d31c971..1bb4a9608e 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -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;
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index 14966d4096..0476d606f5 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -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));
}
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index b0068f2a82..32dc96ee82 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -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);
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index d3b2a2c7a5..72b60daecc 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -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 = idstr,
};
return qemuMonitorJSONSetObjectProperty(mon, vmstatepath, "id-list",
&prop);
diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
index 64af758885..a550dac33c 100644
--- a/src/qemu/qemu_monitor_json.h
+++ b/src/qemu/qemu_monitor_json.h
@@ -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
diff --git a/src/qemu/qemu_slirp.c b/src/qemu/qemu_slirp.c
index 62a6665679..7f6156fbc1 100644
--- a/src/qemu/qemu_slirp.c
+++ b/src/qemu/qemu_slirp.c
@@ -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");
}
--
2.29.2