migParams) < 0)
goto error;
- if (qemuMigrationCapsGet(vm, QEMU_MONITOR_MIGRATION_CAPS_PAUSE_BEFORE_SWITCHOVER) &&
- qemuMigrationParamsSetCapability(vm,
- QEMU_MONITOR_MIGRATION_CAPS_PAUSE_BEFORE_SWITCHOVER,
- true, migParams) < 0)
- goto error;
-
if (qemuMigrationParamsCheck(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
migParams) < 0)
goto error;
qemuMonitorMigrationParams params;
};
+typedef struct _qemuMigrationParamsAlwaysOnItem qemuMigrationParamsAlwaysOnItem;
+struct _qemuMigrationParamsAlwaysOnItem {
+ qemuMonitorMigrationCaps cap;
+ int party; /* bit-wise OR of qemuMigrationParty */
+};
+
+/* Migration capabilities which should always be enabled as long as they
+ * are supported by QEMU. */
+static const qemuMigrationParamsAlwaysOnItem qemuMigrationParamsAlwaysOn[] = {
+ {QEMU_MONITOR_MIGRATION_CAPS_PAUSE_BEFORE_SWITCHOVER,
+ QEMU_MIGRATION_SOURCE},
+};
+
static qemuMigrationParamsPtr
qemuMigrationParamsNew(void)
qemuDomainObjPrivatePtr priv = vm->privateData;
qemuMigrationParamsPtr origParams = NULL;
qemuMonitorMigrationCaps cap;
+ qemuMigrationParty party;
+ size_t i;
int ret = -1;
+ if (asyncJob == QEMU_ASYNC_JOB_MIGRATION_OUT)
+ party = QEMU_MIGRATION_SOURCE;
+ else
+ party = QEMU_MIGRATION_DESTINATION;
+
for (cap = 0; cap < QEMU_MONITOR_MIGRATION_CAPS_LAST; cap++) {
bool state = false;
}
}
+ for (i = 0; i < ARRAY_CARDINALITY(qemuMigrationParamsAlwaysOn); i++) {
+ cap = qemuMigrationParamsAlwaysOn[i].cap;
+
+ if (qemuMigrationParamsAlwaysOn[i].party & party &&
+ qemuMigrationCapsGet(vm, cap)) {
+ VIR_DEBUG("Enabling migration capability '%s'",
+ qemuMonitorMigrationCapsTypeToString(cap));
+ ignore_value(virBitmapSetBit(migParams->caps, cap));
+ }
+ }
+
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
return -1;