qemu: Convert 'priv->dbusVMStateIds' to a GSList

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>
This commit is contained in:
Peter Krempa 2021-02-05 10:48:51 +01:00
parent b297714793
commit 4ebc278657
11 changed files with 46 additions and 32 deletions

View 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)) {

View 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;
}
}
}

View 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);

View 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;

View 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;

View 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;

View 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)
return 0;
path = g_strdup_printf("/objects/%s",
qemuDomainGetDBusVMStateAlias());
QEMU_CHECK_MONITOR(mon);
return qemuMonitorJSONSetDBusVMStateIdList(mon, path, list);
if (!list)
return 0;
for (next = list; next; next = next->next)
virBufferAsprintf(&buf, "%s,", (const char *) next->data);
virBufferTrim(&buf, ",");
path = g_strdup_printf("/objects/%s", qemuDomainGetDBusVMStateAlias());
return qemuMonitorJSONSetDBusVMStateIdList(mon, path,
virBufferCurrentContent(&buf));
}

View 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);

View 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);

View 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

View 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");
}