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;
|
g_autoptr(virJSONValue) props = NULL;
|
||||||
qemuDomainObjPrivatePtr priv = QEMU_DOMAIN_PRIVATE(vm);
|
qemuDomainObjPrivatePtr priv = QEMU_DOMAIN_PRIVATE(vm);
|
||||||
|
|
||||||
if (virStringListLength((const char **)priv->dbusVMStateIds) == 0)
|
if (!priv->dbusVMStateIds)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DBUS_VMSTATE)) {
|
if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DBUS_VMSTATE)) {
|
||||||
|
@ -287,15 +287,28 @@ qemuDBusStart(virQEMUDriverPtr driver,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
void
|
||||||
qemuDBusVMStateAdd(virDomainObjPtr vm, const char *id)
|
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
|
void
|
||||||
qemuDBusVMStateRemove(virDomainObjPtr vm, const char *id)
|
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,
|
void qemuDBusStop(virQEMUDriverPtr driver,
|
||||||
virDomainObjPtr vm);
|
virDomainObjPtr vm);
|
||||||
|
|
||||||
int qemuDBusVMStateAdd(virDomainObjPtr vm, const char *id);
|
void qemuDBusVMStateAdd(virDomainObjPtr vm, const char *id);
|
||||||
|
|
||||||
void qemuDBusVMStateRemove(virDomainObjPtr vm, const char *id);
|
void qemuDBusVMStateRemove(virDomainObjPtr vm, const char *id);
|
||||||
|
|
||||||
|
@ -1785,8 +1785,8 @@ qemuDomainObjPrivateDataClear(qemuDomainObjPrivatePtr priv)
|
|||||||
|
|
||||||
priv->dbusDaemonRunning = false;
|
priv->dbusDaemonRunning = false;
|
||||||
|
|
||||||
g_strfreev(priv->dbusVMStateIds);
|
if (priv->dbusVMStateIds)
|
||||||
priv->dbusVMStateIds = NULL;
|
g_slist_free_full(g_steal_pointer(&priv->dbusVMStateIds), g_free);
|
||||||
|
|
||||||
priv->dbusVMState = false;
|
priv->dbusVMState = false;
|
||||||
|
|
||||||
|
@ -260,7 +260,7 @@ struct _qemuDomainObjPrivate {
|
|||||||
bool dbusDaemonRunning;
|
bool dbusDaemonRunning;
|
||||||
|
|
||||||
/* list of Ids to migrate */
|
/* list of Ids to migrate */
|
||||||
char **dbusVMStateIds;
|
GSList *dbusVMStateIds;
|
||||||
/* true if -object dbus-vmstate was added */
|
/* true if -object dbus-vmstate was added */
|
||||||
bool dbusVMState;
|
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)) {
|
!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DBUS_VMSTATE)) {
|
||||||
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
|
||||||
_("cannot migrate this domain without dbus-vmstate support"));
|
_("cannot migrate this domain without dbus-vmstate support"));
|
||||||
@ -2091,8 +2091,7 @@ qemuMigrationDstRun(virQEMUDriverPtr driver,
|
|||||||
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
|
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
rv = qemuMonitorSetDBusVMStateIdList(priv->mon,
|
rv = qemuMonitorSetDBusVMStateIdList(priv->mon, priv->dbusVMStateIds);
|
||||||
(const char **)priv->dbusVMStateIds);
|
|
||||||
if (rv < 0)
|
if (rv < 0)
|
||||||
goto exit_monitor;
|
goto exit_monitor;
|
||||||
|
|
||||||
@ -3602,7 +3601,7 @@ qemuMigrationSetDBusVMState(virQEMUDriverPtr driver,
|
|||||||
{
|
{
|
||||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||||
|
|
||||||
if (virStringListLength((const char **)priv->dbusVMStateIds) > 0) {
|
if (priv->dbusVMStateIds) {
|
||||||
int rv;
|
int rv;
|
||||||
|
|
||||||
if (qemuHotplugAttachDBusVMState(driver, vm, QEMU_ASYNC_JOB_NONE) < 0)
|
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)
|
if (qemuDomainObjEnterMonitorAsync(driver, vm, QEMU_ASYNC_JOB_NONE) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
rv = qemuMonitorSetDBusVMStateIdList(priv->mon,
|
rv = qemuMonitorSetDBusVMStateIdList(priv->mon, priv->dbusVMStateIds);
|
||||||
(const char **)priv->dbusVMStateIds);
|
|
||||||
|
|
||||||
if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
||||||
rv = -1;
|
rv = -1;
|
||||||
|
@ -2385,21 +2385,28 @@ qemuMonitorSavePhysicalMemory(qemuMonitorPtr mon,
|
|||||||
|
|
||||||
int
|
int
|
||||||
qemuMonitorSetDBusVMStateIdList(qemuMonitorPtr mon,
|
qemuMonitorSetDBusVMStateIdList(qemuMonitorPtr mon,
|
||||||
const char **list)
|
GSList *list)
|
||||||
{
|
{
|
||||||
g_autofree char *path = NULL;
|
g_autofree char *path = NULL;
|
||||||
|
g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
|
||||||
|
GSList *next;
|
||||||
|
|
||||||
VIR_DEBUG("list=%p", list);
|
VIR_DEBUG("list=%p", list);
|
||||||
|
|
||||||
if (virStringListLength(list) == 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
path = g_strdup_printf("/objects/%s",
|
|
||||||
qemuDomainGetDBusVMStateAlias());
|
|
||||||
|
|
||||||
QEMU_CHECK_MONITOR(mon);
|
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);
|
const char *path);
|
||||||
|
|
||||||
int qemuMonitorSetDBusVMStateIdList(qemuMonitorPtr mon,
|
int qemuMonitorSetDBusVMStateIdList(qemuMonitorPtr mon,
|
||||||
const char **list);
|
GSList *list);
|
||||||
|
|
||||||
int qemuMonitorSetMigrationSpeed(qemuMonitorPtr mon,
|
int qemuMonitorSetMigrationSpeed(qemuMonitorPtr mon,
|
||||||
unsigned long bandwidth);
|
unsigned long bandwidth);
|
||||||
|
@ -2359,12 +2359,11 @@ qemuMonitorJSONSetMemoryStatsPeriod(qemuMonitorPtr mon,
|
|||||||
int
|
int
|
||||||
qemuMonitorJSONSetDBusVMStateIdList(qemuMonitorPtr mon,
|
qemuMonitorJSONSetDBusVMStateIdList(qemuMonitorPtr mon,
|
||||||
const char *vmstatepath,
|
const char *vmstatepath,
|
||||||
const char **list)
|
const char *idstr)
|
||||||
{
|
{
|
||||||
g_autofree char *str = virStringListJoin(list, ",");
|
|
||||||
qemuMonitorJSONObjectProperty prop = {
|
qemuMonitorJSONObjectProperty prop = {
|
||||||
.type = QEMU_MONITOR_OBJECT_PROPERTY_STRING,
|
.type = QEMU_MONITOR_OBJECT_PROPERTY_STRING,
|
||||||
.val.str = str,
|
.val.str = (char *) idstr,
|
||||||
};
|
};
|
||||||
|
|
||||||
return qemuMonitorJSONSetObjectProperty(mon, vmstatepath, "id-list", &prop);
|
return qemuMonitorJSONSetObjectProperty(mon, vmstatepath, "id-list", &prop);
|
||||||
|
@ -699,7 +699,7 @@ qemuMonitorJSONTransactionBackup(virJSONValuePtr actions,
|
|||||||
|
|
||||||
int qemuMonitorJSONSetDBusVMStateIdList(qemuMonitorPtr mon,
|
int qemuMonitorJSONSetDBusVMStateIdList(qemuMonitorPtr mon,
|
||||||
const char *vmstatepath,
|
const char *vmstatepath,
|
||||||
const char **list)
|
const char *idstr)
|
||||||
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -320,11 +320,8 @@ qemuSlirpStart(qemuSlirpPtr slirp,
|
|||||||
virCommandAddArgFormat(cmd, "--dbus-address=%s", dbus_addr);
|
virCommandAddArgFormat(cmd, "--dbus-address=%s", dbus_addr);
|
||||||
|
|
||||||
if (qemuSlirpHasFeature(slirp, QEMU_SLIRP_FEATURE_MIGRATE)) {
|
if (qemuSlirpHasFeature(slirp, QEMU_SLIRP_FEATURE_MIGRATE)) {
|
||||||
if (qemuDBusVMStateAdd(vm, id) < 0) {
|
qemuDBusVMStateAdd(vm, id);
|
||||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
||||||
_("Failed to register slirp migration"));
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
if (incoming)
|
if (incoming)
|
||||||
virCommandAddArg(cmd, "--dbus-incoming");
|
virCommandAddArg(cmd, "--dbus-incoming");
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user