diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index bef5b940fe..ef3fa1bf48 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -1805,6 +1805,7 @@ qemuMigrationSetOffline(virQEMUDriverPtr driver, static int qemuMigrationSetCompression(virQEMUDriverPtr driver, virDomainObjPtr vm, + bool state, qemuDomainAsyncJob job) { qemuDomainObjPrivatePtr priv = vm->privateData; @@ -1819,6 +1820,9 @@ qemuMigrationSetCompression(virQEMUDriverPtr driver, 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, "%s", @@ -1835,7 +1839,8 @@ qemuMigrationSetCompression(virQEMUDriverPtr driver, ret = qemuMonitorSetMigrationCapability( priv->mon, - QEMU_MONITOR_MIGRATION_CAPS_XBZRLE); + QEMU_MONITOR_MIGRATION_CAPS_XBZRLE, + state); cleanup: qemuDomainObjExitMonitor(driver, vm); @@ -1845,6 +1850,7 @@ qemuMigrationSetCompression(virQEMUDriverPtr driver, static int qemuMigrationSetAutoConverge(virQEMUDriverPtr driver, virDomainObjPtr vm, + bool state, qemuDomainAsyncJob job) { qemuDomainObjPrivatePtr priv = vm->privateData; @@ -1859,6 +1865,9 @@ qemuMigrationSetAutoConverge(virQEMUDriverPtr driver, if (ret < 0) { goto cleanup; + } else if (ret == 0 && !state) { + /* Unsupported but we want it off anyway */ + goto cleanup; } else if (ret == 0) { virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s", _("Auto-Converge is not supported by " @@ -1869,7 +1878,8 @@ qemuMigrationSetAutoConverge(virQEMUDriverPtr driver, ret = qemuMonitorSetMigrationCapability( priv->mon, - QEMU_MONITOR_MIGRATION_CAPS_AUTO_CONVERGE); + QEMU_MONITOR_MIGRATION_CAPS_AUTO_CONVERGE, + state); cleanup: qemuDomainObjExitMonitor(driver, vm); @@ -1880,6 +1890,7 @@ qemuMigrationSetAutoConverge(virQEMUDriverPtr driver, static int qemuMigrationSetPinAll(virQEMUDriverPtr driver, virDomainObjPtr vm, + bool state, qemuDomainAsyncJob job) { qemuDomainObjPrivatePtr priv = vm->privateData; @@ -1894,6 +1905,9 @@ qemuMigrationSetPinAll(virQEMUDriverPtr driver, 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, "%s", @@ -1910,7 +1924,8 @@ qemuMigrationSetPinAll(virQEMUDriverPtr driver, ret = qemuMonitorSetMigrationCapability( priv->mon, - QEMU_MONITOR_MIGRATION_CAPS_RDMA_PIN_ALL); + QEMU_MONITOR_MIGRATION_CAPS_RDMA_PIN_ALL, + state); cleanup: qemuDomainObjExitMonitor(driver, vm); @@ -2737,8 +2752,8 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver, dataFD[1] = -1; /* 'st' owns the FD now & will close it */ } - if (flags & VIR_MIGRATE_COMPRESSED && - qemuMigrationSetCompression(driver, vm, + if (qemuMigrationSetCompression(driver, vm, + flags & VIR_MIGRATE_COMPRESSED, QEMU_ASYNC_JOB_MIGRATION_IN) < 0) goto stop; @@ -2747,8 +2762,9 @@ qemuMigrationPrepareAny(virQEMUDriverPtr driver, goto stop; } - if (flags & VIR_MIGRATE_RDMA_PIN_ALL && - qemuMigrationSetPinAll(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN) < 0) + if (qemuMigrationSetPinAll(driver, vm, + flags & VIR_MIGRATE_RDMA_PIN_ALL, + QEMU_ASYNC_JOB_MIGRATION_IN) < 0) goto stop; if (mig->lockState) { @@ -3572,18 +3588,18 @@ qemuMigrationRun(virQEMUDriverPtr driver, goto cleanup; } - if (flags & VIR_MIGRATE_COMPRESSED && - qemuMigrationSetCompression(driver, vm, + if (qemuMigrationSetCompression(driver, vm, + flags & VIR_MIGRATE_COMPRESSED, QEMU_ASYNC_JOB_MIGRATION_OUT) < 0) goto cleanup; - if (flags & VIR_MIGRATE_AUTO_CONVERGE && - qemuMigrationSetAutoConverge(driver, vm, + if (qemuMigrationSetAutoConverge(driver, vm, + flags & VIR_MIGRATE_AUTO_CONVERGE, QEMU_ASYNC_JOB_MIGRATION_OUT) < 0) goto cleanup; - if (flags & VIR_MIGRATE_RDMA_PIN_ALL && - qemuMigrationSetPinAll(driver, vm, + if (qemuMigrationSetPinAll(driver, vm, + flags & VIR_MIGRATE_RDMA_PIN_ALL, QEMU_ASYNC_JOB_MIGRATION_OUT) < 0) goto cleanup; diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 276649d262..330fd76c6a 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -3930,7 +3930,8 @@ int qemuMonitorGetMigrationCapability(qemuMonitorPtr mon, } int qemuMonitorSetMigrationCapability(qemuMonitorPtr mon, - qemuMonitorMigrationCaps capability) + qemuMonitorMigrationCaps capability, + bool state) { VIR_DEBUG("mon=%p capability=%d", mon, capability); @@ -3946,7 +3947,7 @@ int qemuMonitorSetMigrationCapability(qemuMonitorPtr mon, return -1; } - return qemuMonitorJSONSetMigrationCapability(mon, capability); + return qemuMonitorJSONSetMigrationCapability(mon, capability, state); } int qemuMonitorNBDServerStart(qemuMonitorPtr mon, diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 76c91a3719..24c36dd1e9 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -506,7 +506,8 @@ int qemuMonitorGetMigrationCapabilities(qemuMonitorPtr mon, int qemuMonitorGetMigrationCapability(qemuMonitorPtr mon, qemuMonitorMigrationCaps capability); int qemuMonitorSetMigrationCapability(qemuMonitorPtr mon, - qemuMonitorMigrationCaps capability); + qemuMonitorMigrationCaps capability, + bool state); typedef enum { QEMU_MONITOR_MIGRATE_BACKGROUND = 1 << 0, diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 91a7aba1db..b5f9496d65 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -5597,7 +5597,8 @@ qemuMonitorJSONGetMigrationCapability(qemuMonitorPtr mon, int qemuMonitorJSONSetMigrationCapability(qemuMonitorPtr mon, - qemuMonitorMigrationCaps capability) + qemuMonitorMigrationCaps capability, + bool state) { int ret = -1; @@ -5617,7 +5618,7 @@ qemuMonitorJSONSetMigrationCapability(qemuMonitorPtr mon, qemuMonitorMigrationCapsTypeToString(capability)) < 0) goto cleanup; - if (virJSONValueObjectAppendBoolean(cap, "state", 1) < 0) + if (virJSONValueObjectAppendBoolean(cap, "state", state) < 0) goto cleanup; if (virJSONValueArrayAppend(caps, cap) < 0) diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index 3b6159a070..a966f9702d 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -142,7 +142,8 @@ int qemuMonitorJSONGetMigrationCapabilities(qemuMonitorPtr mon, int qemuMonitorJSONGetMigrationCapability(qemuMonitorPtr mon, qemuMonitorMigrationCaps capability); int qemuMonitorJSONSetMigrationCapability(qemuMonitorPtr mon, - qemuMonitorMigrationCaps capability); + qemuMonitorMigrationCaps capability, + bool state); int qemuMonitorJSONMigrate(qemuMonitorPtr mon, unsigned int flags, diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index 1b202fb6bf..196901cd6a 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -1939,7 +1939,8 @@ testQemuMonitorJSONqemuMonitorJSONGetMigrationCapability(const void *data) } if (qemuMonitorJSONSetMigrationCapability(qemuMonitorTestGetMonitor(test), - QEMU_MONITOR_MIGRATION_CAPS_XBZRLE) < 0) + QEMU_MONITOR_MIGRATION_CAPS_XBZRLE, + true) < 0) goto cleanup; ret = 0;