From: zhengchuan <zhengchuan(a)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@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