From: zhengchuan <zhengch...@huawei.com>

support migration multifd thread pin by configuration.

Signed-off-by:zhengchuan<zhengch...@huawei.com>
---
 src/qemu/qemu_migration.c |  2 ++
 src/qemu/qemu_process.c   | 61 +++++++++++++++++++++++++++++++++++++++
 src/qemu/qemu_process.h   |  4 +++
 3 files changed, 67 insertions(+)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 7e2894eb76..fe7e2a0737 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -3336,6 +3336,8 @@ qemuMigrationDstPrepareFresh(virQEMUDriver *driver,
     priv = vm->privateData;
     priv->origname = g_strdup(origname);
     g_free(priv->migrationPids);
+    g_free(priv->migrationMultiFdPids);
+    priv->migrationMultiFdCount = 0;
 
     if (taint_hook) {
         /* Domain XML has been altered by a hook script. */
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 361daee081..1914aaa992 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -1792,6 +1792,7 @@ static qemuMonitorCallbacks monitorCallbacks = {
     .domainMemoryDeviceSizeChange = qemuProcessHandleMemoryDeviceSizeChange,
     .domainDeviceUnplugError = qemuProcessHandleDeviceUnplugErr,
     .domainMigrationPid = qemuProcessHandleMigrationPid,
+    .domainMigrationMultiFdPids = qemuProcessHandleMigrationMultiFdPids,
 };
 
 static void
@@ -3862,6 +3863,66 @@ qemuProcessHandleMigrationPid(qemuMonitor *mon 
ATTRIBUTE_UNUSED,
     return 0;
 }
 
+int
+qemuProcessHandleMigrationMultiFdPids(qemuMonitor *mon ATTRIBUTE_UNUSED,
+                                      virDomainObj *vm,
+                                      int mpid)
+{
+    qemuDomainObjPrivate *priv = NULL;
+    char *mpidOldStr = NULL;
+    char *mpidStr = NULL;
+    virDomainMigrationIDDef *migration = NULL;
+    virBitmap *pcpumap = NULL;
+    virObjectLock(vm);
+
+    VIR_INFO("Migrating domain %p %s, migration-multifd pid %d",
+              vm, vm->def->name, mpid);
+
+    priv = vm->privateData;
+    if (vm->job->asyncJob == VIR_ASYNC_JOB_NONE) {
+        VIR_DEBUG("got MIGRATION_MULTIFD_PID event without a migration job");
+        goto cleanup;
+    }
+
+    migration = g_new0(virDomainMigrationIDDef, 1);
+    migration->thread_id = mpid;
+
+    if (qemuProcessSetupMigration(vm, migration) < 0) {
+        VIR_ERROR(_("fail to setup migration multiFd cgroup"));
+        goto cleanup;
+    }
+
+    mpidOldStr = priv->migrationMultiFdPids;
+    if (!mpidOldStr) {
+        mpidStr = g_strdup_printf("%d", mpid);
+    } else {
+        mpidStr = g_strdup_printf("%s/%d", mpidOldStr, mpid);
+    }
+
+    g_free(priv->migrationMultiFdPids);
+    priv->migrationMultiFdPids = mpidStr;
+    priv->migrationMultiFdCount++;
+
+    pcpumap = qemuProcessGetPcpumap(priv);
+
+    if (!pcpumap)
+        goto cleanup;
+
+    qemuProcessSetMigthreadAffinity(priv, pcpumap, mpid);
+
+ cleanup:
+    /*
+     * If the value of pcpumap is setted by priv->migrationThreadPinList,
+     * we need to free pcpumap.
+     */
+    if (pcpumap != priv->pcpumap)
+        virBitmapFree(pcpumap);
+    virDomainMigrationIDDefFree(migration);
+    virObjectUnlock(vm);
+
+    return 0;
+}
+
 
 static int
 qemuProcessRecoverJob(virQEMUDriver *driver,
diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h
index 12e2cc1f48..d41959bc97 100644
--- a/src/qemu/qemu_process.h
+++ b/src/qemu/qemu_process.h
@@ -253,3 +253,7 @@ int qemuProcessSetupMigration(virDomainObj *vm,
 int qemuProcessHandleMigrationPid(qemuMonitor *mon ATTRIBUTE_UNUSED,
                                   virDomainObj *vm,
                                   int mpid);
+
+int qemuProcessHandleMigrationMultiFdPids(qemuMonitor *mon ATTRIBUTE_UNUSED,
+                                          virDomainObj *vm,
+                                          int mpid);
-- 
2.33.0

Reply via email to