Migration capabilities are closely related to migration parameters and
it makes sense to keep them in a single data structure. Similarly to
migration parameters the capabilities are all send to QEMU at once in
qemuMigrationParamsApply, all other APIs operate on the
qemuMigrationParams structure.
Signed-off-by: Jiri Denemark <jdenemar(a)redhat.com>
---
src/qemu/qemu_migration.c | 100 ++++++-------------------------
src/qemu/qemu_migration.h | 7 ---
src/qemu/qemu_migration_params.c | 99 +++++++++++++++++++++++-------
src/qemu/qemu_migration_params.h | 11 ++++
4 files changed, 107 insertions(+), 110 deletions(-)
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 3e775ea56b..3240e7d67b 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -1174,66 +1174,6 @@ qemuMigrationAnyPostcopyFailed(virQEMUDriverPtr driver,
}
-int
-qemuMigrationOptionSet(virQEMUDriverPtr driver,
- virDomainObjPtr vm,
- qemuMonitorMigrationCaps capability,
- bool state,
- qemuDomainAsyncJob job)
-{
- qemuDomainObjPrivatePtr priv = vm->privateData;
- int ret;
-
- if (!qemuMigrationCapsGet(vm, capability)) {
- if (!state) {
- /* Unsupported but we want it off anyway */
- return 0;
- }
-
- if (job == QEMU_ASYNC_JOB_MIGRATION_IN) {
- virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED,
- _("Migration option '%s' is not supported by
"
- "target QEMU binary"),
- qemuMonitorMigrationCapsTypeToString(capability));
- } else {
- virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED,
- _("Migration option '%s' is not supported by
"
- "source QEMU binary"),
- qemuMonitorMigrationCapsTypeToString(capability));
- }
- return -1;
- }
-
- if (qemuDomainObjEnterMonitorAsync(driver, vm, job) < 0)
- return -1;
-
- ret = qemuMonitorSetMigrationCapability(priv->mon, capability, state);
-
- if (qemuDomainObjExitMonitor(driver, vm) < 0)
- ret = -1;
-
- return ret;
-}
-
-
-static int
-qemuMigrationOptionSetPostCopy(virQEMUDriverPtr driver,
- virDomainObjPtr vm,
- bool state,
- qemuDomainAsyncJob job)
-{
- qemuDomainObjPrivatePtr priv = vm->privateData;
-
- if (qemuMigrationOptionSet(driver, vm,
- QEMU_MONITOR_MIGRATION_CAPS_POSTCOPY,
- state, job) < 0)
- return -1;
-
- priv->job.postcopyEnabled = state;
- return 0;
-}
-
-
static int
qemuMigrationSrcWaitForSpice(virDomainObjPtr vm)
{
@@ -2468,15 +2408,14 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
goto stopjob;
}
- if (qemuMigrationOptionSet(driver, vm,
- QEMU_MONITOR_MIGRATION_CAPS_RDMA_PIN_ALL,
- flags & VIR_MIGRATE_RDMA_PIN_ALL,
- QEMU_ASYNC_JOB_MIGRATION_IN) < 0)
+ if (qemuMigrationParamsSetCapability(vm,
+ QEMU_MONITOR_MIGRATION_CAPS_RDMA_PIN_ALL,
+ flags & VIR_MIGRATE_RDMA_PIN_ALL,
+ migParams) < 0)
goto stopjob;
- if (qemuMigrationOptionSetPostCopy(driver, vm,
- flags & VIR_MIGRATE_POSTCOPY,
- QEMU_ASYNC_JOB_MIGRATION_IN) < 0)
+ if (qemuMigrationParamsSetPostCopy(vm, flags & VIR_MIGRATE_POSTCOPY,
+ migParams) < 0)
goto stopjob;
if (qemuMigrationParamsApply(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN,
@@ -3451,27 +3390,26 @@ qemuMigrationSrcRun(virQEMUDriverPtr driver,
compression, migParams) < 0)
goto error;
- if (qemuMigrationOptionSet(driver, vm,
- QEMU_MONITOR_MIGRATION_CAPS_AUTO_CONVERGE,
- flags & VIR_MIGRATE_AUTO_CONVERGE,
- QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
+ if (qemuMigrationParamsSetCapability(vm,
+ QEMU_MONITOR_MIGRATION_CAPS_AUTO_CONVERGE,
+ flags & VIR_MIGRATE_AUTO_CONVERGE,
+ migParams) < 0)
goto error;
- if (qemuMigrationOptionSet(driver, vm,
- QEMU_MONITOR_MIGRATION_CAPS_RDMA_PIN_ALL,
- flags & VIR_MIGRATE_RDMA_PIN_ALL,
- QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
+ if (qemuMigrationParamsSetCapability(vm,
+ QEMU_MONITOR_MIGRATION_CAPS_RDMA_PIN_ALL,
+ flags & VIR_MIGRATE_RDMA_PIN_ALL,
+ migParams) < 0)
goto error;
- if (qemuMigrationOptionSetPostCopy(driver, vm,
- flags & VIR_MIGRATE_POSTCOPY,
- QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
+ if (qemuMigrationParamsSetPostCopy(vm, flags & VIR_MIGRATE_POSTCOPY,
+ migParams) < 0)
goto error;
if (qemuMigrationCapsGet(vm, QEMU_MONITOR_MIGRATION_CAPS_PAUSE_BEFORE_SWITCHOVER)
&&
- qemuMigrationOptionSet(driver, vm,
- QEMU_MONITOR_MIGRATION_CAPS_PAUSE_BEFORE_SWITCHOVER,
- true, QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
+ qemuMigrationParamsSetCapability(vm,
+
QEMU_MONITOR_MIGRATION_CAPS_PAUSE_BEFORE_SWITCHOVER,
+ true, migParams) < 0)
goto error;
if (qemuMigrationParamsApply(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
index b15eca9e51..c753a57028 100644
--- a/src/qemu/qemu_migration.h
+++ b/src/qemu/qemu_migration.h
@@ -283,11 +283,4 @@ bool
qemuMigrationCapsGet(virDomainObjPtr vm,
qemuMonitorMigrationCaps cap);
-int
-qemuMigrationOptionSet(virQEMUDriverPtr driver,
- virDomainObjPtr vm,
- qemuMonitorMigrationCaps capability,
- bool state,
- qemuDomainAsyncJob job);
-
#endif /* __QEMU_MIGRATION_H__ */
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index 42c7c6a3ec..83d3247017 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -39,6 +39,7 @@ VIR_LOG_INIT("qemu.qemu_migration_params");
#define QEMU_MIGRATION_TLS_ALIAS_BASE "libvirt_migrate"
struct _qemuMigrationParams {
+ virBitmapPtr caps;
qemuMonitorMigrationParams params;
};
@@ -51,7 +52,15 @@ qemuMigrationParamsNew(void)
if (VIR_ALLOC(params) < 0)
return NULL;
+ params->caps = virBitmapNew(QEMU_MONITOR_MIGRATION_CAPS_LAST);
+ if (!params->caps)
+ goto error;
+
return params;
+
+ error:
+ qemuMigrationParamsFree(params);
+ return NULL;
}
@@ -61,6 +70,7 @@ qemuMigrationParamsFree(qemuMigrationParamsPtr migParams)
if (!migParams)
return;
+ virBitmapFree(migParams->caps);
VIR_FREE(migParams->params.tlsCreds);
VIR_FREE(migParams->params.tlsHostname);
VIR_FREE(migParams);
@@ -136,6 +146,10 @@ qemuMigrationParamsApply(virQEMUDriverPtr driver,
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
return -1;
+ if (qemuMonitorSetMigrationCapabilities(priv->mon, priv->migrationCaps,
+ migParams->caps) < 0)
+ goto cleanup;
+
if (qemuMonitorSetMigrationParams(priv->mon, &migParams->params) < 0)
goto cleanup;
@@ -149,6 +163,50 @@ qemuMigrationParamsApply(virQEMUDriverPtr driver,
}
+int
+qemuMigrationParamsSetCapability(virDomainObjPtr vm,
+ qemuMonitorMigrationCaps capability,
+ bool state,
+ qemuMigrationParamsPtr migParams)
+{
+ if (!qemuMigrationCapsGet(vm, capability)) {
+ if (!state) {
+ /* Unsupported but we want it off anyway */
+ return 0;
+ }
+
+ virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED,
+ _("Migration option '%s' is not supported by QEMU
binary"),
+ qemuMonitorMigrationCapsTypeToString(capability));
+ return -1;
+ }
+
+ if (state)
+ ignore_value(virBitmapSetBit(migParams->caps, capability));
+ else
+ ignore_value(virBitmapClearBit(migParams->caps, capability));
+
+ return 0;
+}
+
+
+int
+qemuMigrationParamsSetPostCopy(virDomainObjPtr vm,
+ bool state,
+ qemuMigrationParamsPtr migParams)
+{
+ qemuDomainObjPrivatePtr priv = vm->privateData;
+
+ if (qemuMigrationParamsSetCapability(vm,
+ QEMU_MONITOR_MIGRATION_CAPS_POSTCOPY,
+ state, migParams) < 0)
+ return -1;
+
+ priv->job.postcopyEnabled = state;
+ return 0;
+}
+
+
/* qemuMigrationParamsEnableTLS
* @driver: pointer to qemu driver
* @vm: domain object
@@ -272,18 +330,18 @@ qemuMigrationParamsSetCompression(virQEMUDriverPtr driver,
int ret = -1;
qemuDomainObjPrivatePtr priv = vm->privateData;
- if (qemuMigrationOptionSet(driver, vm,
- QEMU_MONITOR_MIGRATION_CAPS_XBZRLE,
- compression->methods &
- (1ULL << QEMU_MIGRATION_COMPRESS_XBZRLE),
- asyncJob) < 0)
+ if (qemuMigrationParamsSetCapability(vm,
+ QEMU_MONITOR_MIGRATION_CAPS_XBZRLE,
+ compression->methods &
+ (1ULL << QEMU_MIGRATION_COMPRESS_XBZRLE),
+ migParams) < 0)
return -1;
- if (qemuMigrationOptionSet(driver, vm,
- QEMU_MONITOR_MIGRATION_CAPS_COMPRESS,
- compression->methods &
- (1ULL << QEMU_MIGRATION_COMPRESS_MT),
- asyncJob) < 0)
+ if (qemuMigrationParamsSetCapability(vm,
+ QEMU_MONITOR_MIGRATION_CAPS_COMPRESS,
+ compression->methods &
+ (1ULL << QEMU_MIGRATION_COMPRESS_MT),
+ migParams) < 0)
return -1;
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
@@ -369,6 +427,11 @@ qemuMigrationParamsCheck(virQEMUDriverPtr driver,
if (!(origParams = qemuMigrationParamsNew()))
goto cleanup;
+ /*
+ * We want to disable all migration capabilities after migration, no need
+ * to ask QEMU for their current settings.
+ */
+
if (qemuMonitorGetMigrationParams(priv->mon, &origParams->params) < 0)
goto cleanup;
@@ -398,25 +461,17 @@ qemuMigrationParamsReset(virQEMUDriverPtr driver,
int asyncJob,
qemuMigrationParamsPtr origParams)
{
- qemuMonitorMigrationCaps cap;
virErrorPtr err = virSaveLastError();
VIR_DEBUG("Resetting migration parameters %p", origParams);
- if (!virDomainObjIsActive(vm))
+ if (!virDomainObjIsActive(vm) || !origParams)
goto cleanup;
- if (origParams) {
- if (qemuMigrationParamsApply(driver, vm, asyncJob, origParams) < 0)
- goto cleanup;
- qemuMigrationParamsResetTLS(driver, vm, asyncJob, origParams);
- }
+ if (qemuMigrationParamsApply(driver, vm, asyncJob, origParams) < 0)
+ goto cleanup;
- for (cap = 0; cap < QEMU_MONITOR_MIGRATION_CAPS_LAST; cap++) {
- if (qemuMigrationCapsGet(vm, cap) &&
- qemuMigrationOptionSet(driver, vm, cap, false, asyncJob) < 0)
- goto cleanup;
- }
+ qemuMigrationParamsResetTLS(driver, vm, asyncJob, origParams);
cleanup:
if (err) {
diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h
index 0f7cb55878..e881ee202d 100644
--- a/src/qemu/qemu_migration_params.h
+++ b/src/qemu/qemu_migration_params.h
@@ -68,6 +68,17 @@ qemuMigrationParamsApply(virQEMUDriverPtr driver,
int asyncJob,
qemuMigrationParamsPtr migParams);
+int
+qemuMigrationParamsSetCapability(virDomainObjPtr vm,
+ qemuMonitorMigrationCaps capability,
+ bool state,
+ qemuMigrationParamsPtr migParams);
+
+int
+qemuMigrationParamsSetPostCopy(virDomainObjPtr vm,
+ bool state,
+ qemuMigrationParamsPtr migParams);
+
int
qemuMigrationParamsEnableTLS(virQEMUDriverPtr driver,
virDomainObjPtr vm,
--
2.17.0