[libvirt] [PATCH 10/11] qemu: Implement auto convergence migration parameters

Jiri Denemark jdenemar at redhat.com
Tue Jun 21 11:47:16 UTC 2016


Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
---
 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




More information about the libvir-list mailing list