All calls to qemuMonitorGetMigrationCapability in QEMU driver are
replaced with qemuMigrationCapsGet.
Signed-off-by: Jiri Denemark <jdenemar(a)redhat.com>
---
src/qemu/qemu_domain.c | 7 +++++++
src/qemu/qemu_driver.c | 32 +++++++++++++-------------------
src/qemu/qemu_migration.c | 45 ++++++++++++++++++++++++++-------------------
src/qemu/qemu_migration.h | 4 ++++
4 files changed, 50 insertions(+), 38 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index a8cabc5727..1dcf263ce5 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -10184,6 +10184,13 @@ qemuDomainCheckMigrationCapabilities(virQEMUDriverPtr driver,
}
}
+ /* Migration events capability must always be enabled, clearing it from
+ * migration capabilities bitmap makes sure it won't be touched anywhere
+ * else.
+ */
+ ignore_value(virBitmapClearBit(priv->migrationCaps,
+ QEMU_MONITOR_MIGRATION_CAPS_EVENTS));
+
ret = 0;
cleanup:
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index fb4d722368..7f77dcb994 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -13413,20 +13413,17 @@ qemuDomainMigrateGetCompressionCache(virDomainPtr dom,
priv = vm->privateData;
- qemuDomainObjEnterMonitor(driver, vm);
-
- ret = qemuMonitorGetMigrationCapability(
- priv->mon,
- QEMU_MONITOR_MIGRATION_CAPS_XBZRLE);
- if (ret == 0) {
+ if (!qemuMigrationCapsGet(vm, QEMU_MONITOR_MIGRATION_CAPS_XBZRLE)) {
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
_("Compressed migration is not supported by "
"QEMU binary"));
- ret = -1;
- } else if (ret > 0) {
- ret = qemuMonitorGetMigrationCacheSize(priv->mon, cacheSize);
+ goto endjob;
}
+ qemuDomainObjEnterMonitor(driver, vm);
+
+ ret = qemuMonitorGetMigrationCacheSize(priv->mon, cacheSize);
+
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
@@ -13467,21 +13464,18 @@ qemuDomainMigrateSetCompressionCache(virDomainPtr dom,
priv = vm->privateData;
- qemuDomainObjEnterMonitor(driver, vm);
-
- ret = qemuMonitorGetMigrationCapability(
- priv->mon,
- QEMU_MONITOR_MIGRATION_CAPS_XBZRLE);
- if (ret == 0) {
+ if (!qemuMigrationCapsGet(vm, QEMU_MONITOR_MIGRATION_CAPS_XBZRLE)) {
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
_("Compressed migration is not supported by "
"QEMU binary"));
- ret = -1;
- } else if (ret > 0) {
- VIR_DEBUG("Setting compression cache to %llu B", cacheSize);
- ret = qemuMonitorSetMigrationCacheSize(priv->mon, cacheSize);
+ goto endjob;
}
+ qemuDomainObjEnterMonitor(driver, vm);
+
+ VIR_DEBUG("Setting compression cache to %llu B", cacheSize);
+ ret = qemuMonitorSetMigrationCacheSize(priv->mon, cacheSize);
+
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index b286d68061..72edbb667c 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -1274,17 +1274,12 @@ qemuMigrationSetOption(virQEMUDriverPtr driver,
qemuDomainObjPrivatePtr priv = vm->privateData;
int ret;
- if (qemuDomainObjEnterMonitorAsync(driver, vm, job) < 0)
- return -1;
+ if (!qemuMigrationCapsGet(vm, capability)) {
+ if (!state) {
+ /* Unsupported but we want it off anyway */
+ return 0;
+ }
- ret = qemuMonitorGetMigrationCapability(priv->mon, capability);
-
- if (ret < 0) {
- goto cleanup;
- } else if (ret == 0 && !state) {
- /* Unsupported but we want it off anyway */
- goto cleanup;
- } else if (ret == 0) {
if (job == QEMU_ASYNC_JOB_MIGRATION_IN) {
virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED,
_("Migration option '%s' is not supported by
"
@@ -1296,15 +1291,17 @@ qemuMigrationSetOption(virQEMUDriverPtr driver,
"source QEMU binary"),
qemuMonitorMigrationCapsTypeToString(capability));
}
- ret = -1;
- goto cleanup;
+ return -1;
}
+ if (qemuDomainObjEnterMonitorAsync(driver, vm, job) < 0)
+ return -1;
+
ret = qemuMonitorSetMigrationCapability(priv->mon, capability, state);
- cleanup:
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
+
return ret;
}
@@ -5923,12 +5920,8 @@ qemuMigrationReset(virQEMUDriverPtr driver,
goto cleanup;
for (cap = 0; cap < QEMU_MONITOR_MIGRATION_CAPS_LAST; cap++) {
- /* "events" capability is set (when supported) in qemuConnectMonitor
- * and should never be cleared */
- if (cap == QEMU_MONITOR_MIGRATION_CAPS_EVENTS)
- continue;
-
- if (qemuMigrationSetOption(driver, vm, cap, false, job) < 0)
+ if (qemuMigrationCapsGet(vm, cap) &&
+ qemuMigrationSetOption(driver, vm, cap, false, job) < 0)
goto cleanup;
}
@@ -5989,3 +5982,17 @@ qemuMigrationFetchMirrorStats(virQEMUDriverPtr driver,
virHashFree(blockinfo);
return 0;
}
+
+
+bool
+qemuMigrationCapsGet(virDomainObjPtr vm,
+ qemuMonitorMigrationCaps cap)
+{
+ qemuDomainObjPrivatePtr priv = vm->privateData;
+ bool enabled = false;
+
+ if (priv->migrationCaps)
+ ignore_value(virBitmapGetBit(priv->migrationCaps, cap, &enabled));
+
+ return enabled;
+}
diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
index 63a4325624..f634138f4d 100644
--- a/src/qemu/qemu_migration.h
+++ b/src/qemu/qemu_migration.h
@@ -326,4 +326,8 @@ qemuMigrationFetchMirrorStats(virQEMUDriverPtr driver,
qemuDomainAsyncJob asyncJob,
qemuDomainJobInfoPtr jobInfo);
+bool
+qemuMigrationCapsGet(virDomainObjPtr vm,
+ qemuMonitorMigrationCaps cap);
+
#endif /* __QEMU_MIGRATION_H__ */
--
2.14.2