goto stopjob;
}
- if (qemuMigrationParamsSetCapability(vm,
- QEMU_MONITOR_MIGRATION_CAPS_RDMA_PIN_ALL,
- flags & VIR_MIGRATE_RDMA_PIN_ALL,
- migParams) < 0)
- goto stopjob;
-
- if (qemuMigrationParamsSetCapability(vm,
- QEMU_MONITOR_MIGRATION_CAPS_POSTCOPY,
- flags & VIR_MIGRATE_POSTCOPY,
- migParams) < 0)
- goto stopjob;
-
if (qemuMigrationParamsCheck(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN,
migParams) < 0)
goto stopjob;
if (qemuMigrationParamsSetCompression(vm, compression, migParams) < 0)
goto error;
- if (qemuMigrationParamsSetCapability(vm,
- QEMU_MONITOR_MIGRATION_CAPS_AUTO_CONVERGE,
- flags & VIR_MIGRATE_AUTO_CONVERGE,
- migParams) < 0)
- goto error;
-
- if (qemuMigrationParamsSetCapability(vm,
- QEMU_MONITOR_MIGRATION_CAPS_RDMA_PIN_ALL,
- flags & VIR_MIGRATE_RDMA_PIN_ALL,
- migParams) < 0)
- goto error;
-
- if (qemuMigrationParamsSetCapability(vm,
- QEMU_MONITOR_MIGRATION_CAPS_POSTCOPY,
- flags & VIR_MIGRATE_POSTCOPY,
- migParams) < 0)
- goto error;
-
if (qemuMigrationParamsCheck(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
migParams) < 0)
goto error;
int party; /* bit-wise OR of qemuMigrationParty */
};
+typedef struct _qemuMigrationParamsFlagMapItem qemuMigrationParamsFlagMapItem;
+struct _qemuMigrationParamsFlagMapItem {
+ virDomainMigrateFlags flag;
+ 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_MIGRATION_SOURCE},
};
+/* Translation from virDomainMigrateFlags to qemuMonitorMigrationCaps. */
+static const qemuMigrationParamsFlagMapItem qemuMigrationParamsFlagMap[] = {
+ {VIR_MIGRATE_RDMA_PIN_ALL,
+ QEMU_MONITOR_MIGRATION_CAPS_RDMA_PIN_ALL,
+ QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION},
+
+ {VIR_MIGRATE_AUTO_CONVERGE,
+ QEMU_MONITOR_MIGRATION_CAPS_AUTO_CONVERGE,
+ QEMU_MIGRATION_SOURCE},
+
+ {VIR_MIGRATE_POSTCOPY,
+ QEMU_MONITOR_MIGRATION_CAPS_POSTCOPY,
+ QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION},
+};
+
static qemuMigrationParamsPtr
qemuMigrationParamsNew(void)
qemuMigrationParty party)
{
qemuMigrationParamsPtr migParams;
+ size_t i;
if (!(migParams = qemuMigrationParamsNew()))
return NULL;
- if (!params)
- return migParams;
+ for (i = 0; i < ARRAY_CARDINALITY(qemuMigrationParamsFlagMap); i++) {
+ qemuMonitorMigrationCaps cap = qemuMigrationParamsFlagMap[i].cap;
+
+ if (qemuMigrationParamsFlagMap[i].party & party &&
+ flags & qemuMigrationParamsFlagMap[i].flag) {
+ VIR_DEBUG("Enabling migration capability '%s'",
+ qemuMonitorMigrationCapsTypeToString(cap));
+ ignore_value(virBitmapSetBit(migParams->caps, cap));
+ }
+ }
#define GET(PARAM, VAR) \
do { \
migParams->params.VAR ## _set = true; \
} while (0)
- if (party == QEMU_MIGRATION_SOURCE) {
- GET(AUTO_CONVERGE_INITIAL, cpuThrottleInitial);
- GET(AUTO_CONVERGE_INCREMENT, cpuThrottleIncrement);
+ if (params) {
+ if (party == QEMU_MIGRATION_SOURCE) {
+ GET(AUTO_CONVERGE_INITIAL, cpuThrottleInitial);
+ GET(AUTO_CONVERGE_INCREMENT, cpuThrottleIncrement);
+ }
}
#undef GET
}
-int
+static int
qemuMigrationParamsSetCapability(virDomainObjPtr vm ATTRIBUTE_UNUSED,
qemuMonitorMigrationCaps capability,
bool state,