mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 03:12:22 +00:00
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:
parent
b297714793
commit
4ebc278657
@ -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)) {
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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");
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user