[PATCH 05/12] migration/migration-pin: add migrationpin for migration parameters

Jiang Jiacheng jiangjiacheng at huawei.com
Tue Jan 3 13:08:24 UTC 2023


From: zhengchuan <zhengchuan at huawei.com>

Add a migrationpin to the migration parameters of live migration to bind cores
to the migration thread during VM migration.

Signed-off-by:zhengchuan<zhengchuan at huawei.com>
---
 include/libvirt/libvirt-domain.h | 10 ++++++++++
 src/qemu/qemu_domain.c           |  1 +
 src/qemu/qemu_domain.h           |  1 +
 src/qemu/qemu_migration.c        |  3 +++
 src/qemu/qemu_migration.h        |  1 +
 src/qemu/qemu_migration_params.c | 21 +++++++++++++++++++++
 src/qemu/qemu_migration_params.h |  4 ++++
 7 files changed, 41 insertions(+)

diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index 26af8292d3..76744eb0f1 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -1367,6 +1367,16 @@ typedef enum {
  */
 # define VIR_MIGRATE_PARAM_TLS_DESTINATION          "tls.destination"
 
+/**
+ * VIR_MIGRATE_PARAM_MIGRATIONPIN:
+ *
+ * virDomainMigrate* params field: the pin of migration threads for
+ * migration as VIR_TYPED_PARAM_STRING.
+ *
+ * Since: 9.1.0
+ */
+# define VIR_MIGRATE_PARAM_MIGRATIONPIN "migration.pin"
+
 /* Domain migration. */
 virDomainPtr virDomainMigrate (virDomainPtr domain, virConnectPtr dconn,
                                unsigned long flags, const char *dname,
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 0bff24dc47..de90cf42f9 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -1829,6 +1829,7 @@ qemuDomainObjPrivateFree(void *data)
     g_free(priv->lockState);
     g_free(priv->origname);
     g_free(priv->migrationPids);
+    g_free(priv->migrationThreadPinList);
 
     virChrdevFree(priv->devs);
 
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index a804a1b46e..5aa4eb5840 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -140,6 +140,7 @@ struct _qemuDomainObjPrivate {
     int nbdPort; /* Port used for migration with NBD */
     unsigned short migrationPort;
     char *migrationPids;
+    char *migrationThreadPinList;
     int preMigrationState;
     unsigned long long preMigrationMemlock; /* Original RLIMIT_MEMLOCK in case
                                                it was changed for the current
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index f4441d61ae..7e2894eb76 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -3335,6 +3335,7 @@ qemuMigrationDstPrepareFresh(virQEMUDriver *driver,
 
     priv = vm->privateData;
     priv->origname = g_strdup(origname);
+    g_free(priv->migrationPids);
 
     if (taint_hook) {
         /* Domain XML has been altered by a hook script. */
@@ -4815,6 +4816,8 @@ qemuMigrationSrcRun(virQEMUDriver *driver,
                                   priv->migMaxBandwidth * 1024 * 1024) < 0)
         goto error;
 
+    qemuMigrationMigrationParamsToVM(migParams, vm);
+
     if (qemuMigrationParamsApply(vm, VIR_ASYNC_JOB_MIGRATION_OUT,
                                  migParams, flags) < 0)
         goto error;
diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
index 38a961f4e9..e40c251261 100644
--- a/src/qemu/qemu_migration.h
+++ b/src/qemu/qemu_migration.h
@@ -80,6 +80,7 @@
     VIR_MIGRATE_PARAM_COMPRESSION_MT_LEVEL,         VIR_TYPED_PARAM_INT, \
     VIR_MIGRATE_PARAM_COMPRESSION_MT_THREADS,       VIR_TYPED_PARAM_INT, \
     VIR_MIGRATE_PARAM_COMPRESSION_MT_DTHREADS,      VIR_TYPED_PARAM_INT, \
+    VIR_MIGRATE_PARAM_MIGRATIONPIN,                 VIR_TYPED_PARAM_STRING, \
     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, \
diff --git a/src/qemu/qemu_migration_params.c b/src/qemu/qemu_migration_params.c
index bd09dcfb23..47d1e29712 100644
--- a/src/qemu/qemu_migration_params.c
+++ b/src/qemu/qemu_migration_params.c
@@ -104,6 +104,7 @@ VIR_ENUM_IMPL(qemuMigrationParam,
               "compress-level",
               "compress-threads",
               "decompress-threads",
+              "migrationpin",
               "cpu-throttle-initial",
               "cpu-throttle-increment",
               "tls-creds",
@@ -212,6 +213,10 @@ static const qemuMigrationParamsTPMapItem qemuMigrationParamsTPMap[] = {
      .param = QEMU_MIGRATION_PARAM_DECOMPRESS_THREADS,
      .party = QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION},
 
+    {.typedParam = VIR_MIGRATE_PARAM_MIGRATIONPIN,
+     .param = QEMU_MIGRATION_PARAM_MIGRATIONPIN,
+     .party = QEMU_MIGRATION_SOURCE},
+
     {.typedParam = VIR_MIGRATE_PARAM_COMPRESSION_XBZRLE_CACHE,
      .param = QEMU_MIGRATION_PARAM_XBZRLE_CACHE_SIZE,
      .party = QEMU_MIGRATION_SOURCE | QEMU_MIGRATION_DESTINATION},
@@ -240,6 +245,9 @@ static const qemuMigrationParamInfoItem qemuMigrationParamInfo[] = {
     [QEMU_MIGRATION_PARAM_DECOMPRESS_THREADS] = {
         .type = QEMU_MIGRATION_PARAM_TYPE_INT,
     },
+    [QEMU_MIGRATION_PARAM_MIGRATIONPIN] = {
+        .type = QEMU_MIGRATION_PARAM_TYPE_STRING,
+    },
     [QEMU_MIGRATION_PARAM_THROTTLE_INITIAL] = {
         .type = QEMU_MIGRATION_PARAM_TYPE_INT,
     },
@@ -578,6 +586,15 @@ qemuMigrationParamsSetCompression(virTypedParameterPtr params,
     return 0;
 }
 
+void
+qemuMigrationMigrationParamsToVM(const qemuMigrationParams *migParams, const virDomainObj *vm)
+{
+    if (migParams && migParams->params[QEMU_MIGRATION_PARAM_MIGRATIONPIN].set) {
+        qemuDomainObjPrivate *priv = vm->privateData;
+        priv->migrationThreadPinList = g_strdup(migParams->params[QEMU_MIGRATION_PARAM_MIGRATIONPIN].value.s);
+    }
+}
+
 
 void
 qemuMigrationParamsSetBlockDirtyBitmapMapping(qemuMigrationParams *migParams,
@@ -798,6 +815,10 @@ qemuMigrationParamsToJSON(qemuMigrationParams *migParams,
         if (!pv->set)
             continue;
 
+        if (i == QEMU_MIGRATION_PARAM_MIGRATIONPIN) {
+            continue;
+        }
+
         if (postcopyResume && !qemuMigrationParamInfo[i].applyOnPostcopyResume)
             continue;
 
diff --git a/src/qemu/qemu_migration_params.h b/src/qemu/qemu_migration_params.h
index e7c65f6a21..8ebebf87a5 100644
--- a/src/qemu/qemu_migration_params.h
+++ b/src/qemu/qemu_migration_params.h
@@ -49,6 +49,7 @@ typedef enum {
     QEMU_MIGRATION_PARAM_COMPRESS_LEVEL,
     QEMU_MIGRATION_PARAM_COMPRESS_THREADS,
     QEMU_MIGRATION_PARAM_DECOMPRESS_THREADS,
+    QEMU_MIGRATION_PARAM_MIGRATIONPIN,
     QEMU_MIGRATION_PARAM_THROTTLE_INITIAL,
     QEMU_MIGRATION_PARAM_THROTTLE_INCREMENT,
     QEMU_MIGRATION_PARAM_TLS_CREDS,
@@ -74,6 +75,9 @@ typedef enum {
 virBitmap *
 qemuMigrationParamsGetAlwaysOnCaps(qemuMigrationParty party);
 
+void
+qemuMigrationMigrationParamsToVM(const qemuMigrationParams *migParams, const virDomainObj *vm);
+
 qemuMigrationParams *
 qemuMigrationParamsFromFlags(virTypedParameterPtr params,
                              int nparams,
-- 
2.33.0



More information about the libvir-list mailing list