Signed-off-by: Jiri Denemark <jdenemar@xxxxxxxxxx> --- src/qemu/qemu_driver.c | 13 ++++-- src/qemu/qemu_migration.c | 101 +++++++++++++++++++++++++++++++++++++--------- src/qemu/qemu_migration.h | 8 ++++ 3 files changed, 99 insertions(+), 23 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index d065e45..2f2eecb 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -11775,6 +11775,7 @@ qemuDomainMigratePerform(virDomainPtr dom, int ret = -1; const char *dconnuri = NULL; qemuMigrationCompressionPtr compression = NULL; + qemuMonitorMigrationParams migParams = { 0 }; virCheckFlags(QEMU_MIGRATION_FLAGS, -1); @@ -11809,7 +11810,7 @@ qemuDomainMigratePerform(virDomainPtr dom, */ ret = qemuMigrationPerform(driver, dom->conn, vm, NULL, NULL, dconnuri, uri, NULL, NULL, 0, NULL, 0, - compression, cookie, cookielen, + compression, &migParams, cookie, cookielen, NULL, NULL, /* No output cookies in v2 */ flags, dname, resource, false); @@ -12198,6 +12199,7 @@ qemuDomainMigratePerform3(virDomainPtr dom, virQEMUDriverPtr driver = dom->conn->privateData; virDomainObjPtr vm; qemuMigrationCompressionPtr compression = NULL; + qemuMonitorMigrationParams migParams = { 0 }; int ret = -1; virCheckFlags(QEMU_MIGRATION_FLAGS, -1); @@ -12215,7 +12217,7 @@ qemuDomainMigratePerform3(virDomainPtr dom, ret = qemuMigrationPerform(driver, dom->conn, vm, xmlin, NULL, dconnuri, uri, NULL, NULL, 0, NULL, 0, - compression, + compression, &migParams, cookiein, cookieinlen, cookieout, cookieoutlen, flags, dname, resource, true); @@ -12249,6 +12251,7 @@ qemuDomainMigratePerform3Params(virDomainPtr dom, unsigned long long bandwidth = 0; int nbdPort = 0; qemuMigrationCompressionPtr compression = NULL; + qemuMonitorMigrationParamsPtr migParams = NULL; int ret = -1; virCheckFlags(QEMU_MIGRATION_FLAGS, -1); @@ -12288,6 +12291,9 @@ qemuDomainMigratePerform3Params(virDomainPtr dom, if (nmigrate_disks < 0) goto cleanup; + if (!(migParams = qemuMigrationParams(params, nparams, flags))) + goto cleanup; + if (!(compression = qemuMigrationCompressionParse(params, nparams, flags))) goto cleanup; @@ -12302,11 +12308,12 @@ qemuDomainMigratePerform3Params(virDomainPtr dom, ret = qemuMigrationPerform(driver, dom->conn, vm, dom_xml, persist_xml, dconnuri, uri, graphicsuri, listenAddress, nmigrate_disks, migrate_disks, nbdPort, - compression, + compression, migParams, cookiein, cookieinlen, cookieout, cookieoutlen, flags, dname, bandwidth, true); cleanup: VIR_FREE(compression); + VIR_FREE(migParams); VIR_FREE(migrate_disks); return ret; } diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 8cfbb9f..b26f363 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -3479,6 +3479,52 @@ qemuMigrationSetCompression(virQEMUDriverPtr driver, } +qemuMonitorMigrationParamsPtr +qemuMigrationParams(virTypedParameterPtr params, + int nparams, + unsigned long flags) +{ + qemuMonitorMigrationParamsPtr migParams; + + if (VIR_ALLOC(migParams) < 0) + return NULL; + + if (!params) + return migParams; + +#define GET(PARAM, VAR) \ + do { \ + int rc; \ + if ((rc = virTypedParamsGetInt(params, nparams, \ + VIR_MIGRATE_PARAM_ ## PARAM, \ + &migParams->VAR)) < 0) \ + goto error; \ + \ + if (rc == 1) \ + migParams->VAR ## _set = true; \ + } while (0) + + GET(AUTO_CONVERGE_INITIAL, cpuThrottleInitial); + GET(AUTO_CONVERGE_INCREMENT, cpuThrottleIncrement); + +#undef GET + + if ((migParams->cpuThrottleInitial_set || + migParams->cpuThrottleIncrement_set) && + !(flags & VIR_MIGRATE_AUTO_CONVERGE)) { + virReportError(VIR_ERR_INVALID_ARG, "%s", + _("Turn auto convergence on to tune it")); + goto error; + } + + return migParams; + + error: + VIR_FREE(migParams); + return NULL; +} + + static int qemuMigrationSetParams(virQEMUDriverPtr driver, virDomainObjPtr vm, @@ -4564,7 +4610,8 @@ qemuMigrationRun(virQEMUDriverPtr driver, const char *graphicsuri, size_t nmigrate_disks, const char **migrate_disks, - qemuMigrationCompressionPtr compression) + qemuMigrationCompressionPtr compression, + qemuMonitorMigrationParamsPtr migParams) { int ret = -1; unsigned int migrate_flags = QEMU_MONITOR_MIGRATE_BACKGROUND; @@ -4582,7 +4629,6 @@ qemuMigrationRun(virQEMUDriverPtr driver, virDomainDefPtr persistDef = NULL; char *timestamp; int rc; - qemuMonitorMigrationParams migParams = { 0 }; VIR_DEBUG("driver=%p, vm=%p, cookiein=%s, cookieinlen=%d, " "cookieout=%p, cookieoutlen=%p, flags=%lx, resource=%lu, " @@ -4663,7 +4709,7 @@ qemuMigrationRun(virQEMUDriverPtr driver, } if (qemuMigrationSetCompression(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT, - compression, &migParams) < 0) + compression, migParams) < 0) goto cleanup; if (qemuMigrationSetOption(driver, vm, @@ -4684,7 +4730,7 @@ qemuMigrationRun(virQEMUDriverPtr driver, goto cleanup; if (qemuMigrationSetParams(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT, - &migParams) < 0) + migParams) < 0) goto cleanup; if (qemuDomainObjEnterMonitorAsync(driver, vm, @@ -4918,7 +4964,8 @@ static int doNativeMigrate(virQEMUDriverPtr driver, const char *graphicsuri, size_t nmigrate_disks, const char **migrate_disks, - qemuMigrationCompressionPtr compression) + qemuMigrationCompressionPtr compression, + qemuMonitorMigrationParamsPtr migParams) { qemuDomainObjPrivatePtr priv = vm->privateData; virURIPtr uribits = NULL; @@ -4969,7 +5016,7 @@ static int doNativeMigrate(virQEMUDriverPtr driver, ret = qemuMigrationRun(driver, vm, persist_xml, cookiein, cookieinlen, cookieout, cookieoutlen, flags, resource, &spec, dconn, graphicsuri, nmigrate_disks, migrate_disks, - compression); + compression, migParams); if (spec.destType == MIGRATION_DEST_FD) VIR_FORCE_CLOSE(spec.dest.fd.qemu); @@ -4995,7 +5042,8 @@ static int doTunnelMigrate(virQEMUDriverPtr driver, const char *graphicsuri, size_t nmigrate_disks, const char **migrate_disks, - qemuMigrationCompressionPtr compression) + qemuMigrationCompressionPtr compression, + qemuMonitorMigrationParamsPtr migParams) { virNetSocketPtr sock = NULL; int ret = -1; @@ -5033,7 +5081,7 @@ static int doTunnelMigrate(virQEMUDriverPtr driver, ret = qemuMigrationRun(driver, vm, persist_xml, cookiein, cookieinlen, cookieout, cookieoutlen, flags, resource, &spec, dconn, graphicsuri, nmigrate_disks, migrate_disks, - compression); + compression, migParams); cleanup: if (spec.destType == MIGRATION_DEST_FD) { @@ -5072,6 +5120,7 @@ static int doPeer2PeerMigrate2(virQEMUDriverPtr driver, virStreamPtr st = NULL; unsigned long destflags; qemuMigrationCompressionPtr compression = NULL; + qemuMonitorMigrationParams migParams = { 0 }; VIR_DEBUG("driver=%p, sconn=%p, dconn=%p, vm=%p, dconnuri=%s, " "flags=%lx, dname=%s, resource=%lu", @@ -5148,12 +5197,13 @@ static int doPeer2PeerMigrate2(virQEMUDriverPtr driver, ret = doTunnelMigrate(driver, vm, st, NULL, NULL, 0, NULL, NULL, flags, resource, dconn, - NULL, 0, NULL, compression); + NULL, 0, NULL, compression, &migParams); else ret = doNativeMigrate(driver, vm, NULL, uri_out, cookie, cookielen, NULL, NULL, /* No out cookie with v2 migration */ - flags, resource, dconn, NULL, 0, NULL, compression); + flags, resource, dconn, NULL, 0, NULL, + compression, &migParams); /* Perform failed. Make sure Finish doesn't overwrite the error */ if (ret < 0) @@ -5221,6 +5271,7 @@ doPeer2PeerMigrate3(virQEMUDriverPtr driver, const char **migrate_disks, int nbdPort, qemuMigrationCompressionPtr compression, + qemuMonitorMigrationParamsPtr migParams, unsigned long long bandwidth, bool useParams, unsigned long flags) @@ -5392,13 +5443,15 @@ doPeer2PeerMigrate3(virQEMUDriverPtr driver, cookiein, cookieinlen, &cookieout, &cookieoutlen, flags, bandwidth, dconn, graphicsuri, - nmigrate_disks, migrate_disks, compression); + nmigrate_disks, migrate_disks, compression, + migParams); } else { ret = doNativeMigrate(driver, vm, persist_xml, uri, cookiein, cookieinlen, &cookieout, &cookieoutlen, flags, bandwidth, dconn, graphicsuri, - nmigrate_disks, migrate_disks, compression); + nmigrate_disks, migrate_disks, compression, + migParams); } /* Perform failed. Make sure Finish doesn't overwrite the error */ @@ -5576,6 +5629,7 @@ static int doPeer2PeerMigrate(virQEMUDriverPtr driver, const char **migrate_disks, int nbdPort, qemuMigrationCompressionPtr compression, + qemuMonitorMigrationParamsPtr migParams, unsigned long flags, const char *dname, unsigned long resource, @@ -5699,8 +5753,8 @@ static int doPeer2PeerMigrate(virQEMUDriverPtr driver, ret = doPeer2PeerMigrate3(driver, sconn, dconn, dconnuri, vm, xmlin, persist_xml, dname, uri, graphicsuri, listenAddress, nmigrate_disks, migrate_disks, - nbdPort, compression, resource, useParams, - flags); + nbdPort, compression, migParams, resource, + useParams, flags); } else { ret = doPeer2PeerMigrate2(driver, sconn, dconn, vm, dconnuri, flags, dname, resource); @@ -5740,6 +5794,7 @@ qemuMigrationPerformJob(virQEMUDriverPtr driver, const char **migrate_disks, int nbdPort, qemuMigrationCompressionPtr compression, + qemuMonitorMigrationParamsPtr migParams, const char *cookiein, int cookieinlen, char **cookieout, @@ -5776,13 +5831,14 @@ qemuMigrationPerformJob(virQEMUDriverPtr driver, ret = doPeer2PeerMigrate(driver, conn, vm, xmlin, persist_xml, dconnuri, uri, graphicsuri, listenAddress, nmigrate_disks, migrate_disks, nbdPort, - compression, flags, dname, resource, &v3proto); + compression, migParams, flags, dname, resource, + &v3proto); } else { qemuMigrationJobSetPhase(driver, vm, QEMU_MIGRATION_PHASE_PERFORM2); ret = doNativeMigrate(driver, vm, persist_xml, uri, cookiein, cookieinlen, cookieout, cookieoutlen, flags, resource, NULL, NULL, 0, NULL, - compression); + compression, migParams); } if (ret < 0) goto endjob; @@ -5845,6 +5901,7 @@ qemuMigrationPerformPhase(virQEMUDriverPtr driver, size_t nmigrate_disks, const char **migrate_disks, qemuMigrationCompressionPtr compression, + qemuMonitorMigrationParamsPtr migParams, const char *cookiein, int cookieinlen, char **cookieout, @@ -5870,7 +5927,7 @@ qemuMigrationPerformPhase(virQEMUDriverPtr driver, ret = doNativeMigrate(driver, vm, persist_xml, uri, cookiein, cookieinlen, cookieout, cookieoutlen, flags, resource, NULL, graphicsuri, - nmigrate_disks, migrate_disks, compression); + nmigrate_disks, migrate_disks, compression, migParams); if (ret < 0) { if (qemuMigrationRestoreDomainState(conn, vm)) { @@ -5915,6 +5972,7 @@ qemuMigrationPerform(virQEMUDriverPtr driver, const char **migrate_disks, int nbdPort, qemuMigrationCompressionPtr compression, + qemuMonitorMigrationParamsPtr migParams, const char *cookiein, int cookieinlen, char **cookieout, @@ -5945,7 +6003,8 @@ qemuMigrationPerform(virQEMUDriverPtr driver, return qemuMigrationPerformJob(driver, conn, vm, xmlin, persist_xml, dconnuri, uri, graphicsuri, listenAddress, nmigrate_disks, migrate_disks, nbdPort, - compression, cookiein, cookieinlen, + compression, migParams, + cookiein, cookieinlen, cookieout, cookieoutlen, flags, dname, resource, v3proto); } else { @@ -5959,14 +6018,16 @@ qemuMigrationPerform(virQEMUDriverPtr driver, return qemuMigrationPerformPhase(driver, conn, vm, persist_xml, uri, graphicsuri, nmigrate_disks, migrate_disks, - compression, cookiein, cookieinlen, + compression, migParams, + cookiein, cookieinlen, cookieout, cookieoutlen, flags, resource); } else { return qemuMigrationPerformJob(driver, conn, vm, xmlin, persist_xml, NULL, uri, graphicsuri, listenAddress, nmigrate_disks, migrate_disks, nbdPort, - compression, cookiein, cookieinlen, + compression, migParams, + cookiein, cookieinlen, cookieout, cookieoutlen, flags, dname, resource, v3proto); } diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h index 8b66275..14c6178 100644 --- a/src/qemu/qemu_migration.h +++ b/src/qemu/qemu_migration.h @@ -65,6 +65,8 @@ typedef qemuMigrationCompression *qemuMigrationCompressionPtr; VIR_MIGRATE_PARAM_COMPRESSION_MT_DTHREADS, VIR_TYPED_PARAM_INT, \ VIR_MIGRATE_PARAM_COMPRESSION_XBZRLE_CACHE, VIR_TYPED_PARAM_ULLONG, \ VIR_MIGRATE_PARAM_PERSIST_XML, VIR_TYPED_PARAM_STRING, \ + VIR_MIGRATE_PARAM_AUTO_CONVERGE_INITIAL, VIR_TYPED_PARAM_INT, \ + VIR_MIGRATE_PARAM_AUTO_CONVERGE_INCREMENT, VIR_TYPED_PARAM_INT, \ NULL @@ -118,6 +120,11 @@ int qemuMigrationCompressionDump(qemuMigrationCompressionPtr compression, int *maxparams, unsigned long *flags); +qemuMonitorMigrationParamsPtr +qemuMigrationParams(virTypedParameterPtr params, + int nparams, + unsigned long flags); + int qemuMigrationJobStart(virQEMUDriverPtr driver, virDomainObjPtr vm, qemuDomainAsyncJob job) @@ -197,6 +204,7 @@ int qemuMigrationPerform(virQEMUDriverPtr driver, const char **migrate_disks, int nbdPort, qemuMigrationCompressionPtr compression, + qemuMonitorMigrationParamsPtr migParams, const char *cookiein, int cookieinlen, char **cookieout, -- 2.9.0 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list