Then, pin migration thread with given cpumap. Introduce
virDomainPinMigrationThread API, and it will be implement in
next patch.

Signed-off-by: zhengchuan<zhengch...@huawei.com>
Signed-off-by: Jiang Jiacheng <jiangjiach...@huawei.com>
---
 include/libvirt/libvirt-domain.h |  5 +++
 src/driver-hypervisor.h          |  6 +++
 src/libvirt-domain.c             | 65 ++++++++++++++++++++++++++++++++
 src/libvirt_public.syms          |  4 ++
 src/remote/remote_driver.c       |  1 +
 src/remote/remote_protocol.x     | 13 ++++++-
 src/remote_protocol-structs      |  5 +++
 7 files changed, 98 insertions(+), 1 deletion(-)

diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index 5152ed4551..b6c01016d8 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -2429,6 +2429,11 @@ int                     virDomainGetEmulatorPinInfo 
(virDomainPtr domain,
                                                      int maplen,
                                                      unsigned int flags);
 
+int                     virDomainPinMigrationThread (virDomainPtr domain,
+                                                     unsigned char *cpumap,
+                                                     int maplen);
+
+
 /**
  * virDomainIOThreadInfo:
  *
diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h
index 5219344b72..a8413b1a6c 100644
--- a/src/driver-hypervisor.h
+++ b/src/driver-hypervisor.h
@@ -1441,6 +1441,11 @@ typedef int
                                   int seconds,
                                   unsigned int flags);
 
+typedef int
+(*virDrvDomainPinMigrationThread)(virDomainPtr domain,
+                                  unsigned char *cpumap,
+                                  int maplen);
+
 typedef int
 (*virDrvDomainFDAssociate)(virDomainPtr domain,
                            const char *name,
@@ -1720,4 +1725,5 @@ struct _virHypervisorDriver {
     virDrvDomainGetMessages domainGetMessages;
     virDrvDomainStartDirtyRateCalc domainStartDirtyRateCalc;
     virDrvDomainFDAssociate domainFDAssociate;
+    virDrvDomainPinMigrationThread domainPinMigrationThread;
 };
diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
index 379057d9a7..a18b7753c2 100644
--- a/src/libvirt-domain.c
+++ b/src/libvirt-domain.c
@@ -14055,3 +14055,68 @@ virDomainFDAssociate(virDomainPtr domain,
     virDispatchError(conn);
     return -1;
 }
+
+/**
+ * virDomainPinMigrationThread:
+ * @domain: a domain object
+ * @cpumap: pointer to a bit map of real CPUs (in 8-bit bytes) (IN)
+ *          Each bit set to 1 means that corresponding CPU is usable.
+ *          Bytes are stored in little-endian order: CPU0-7, 8-15...
+ *          In each byte, lowest CPU number is least significant bit.
+ * @maplen: number of bytes in cpumap, from 1 up to size of CPU map in
+ *          underlying virtualization system (Xen...).
+ *          If maplen < size, missing bytes are set to zero.
+ *          If maplen > size, failure code is returned.
+ *
+ * Allocate the real CPUs to the migrationThread which will be launched
+ * at the beginning of migration.
+ * This allocation can be handled whether before the migration, or during
+ * the migration which performs as an instant change.
+ *
+ * This function may require privileged access to the hypervisor.
+ *
+ * Returns 0 in case of success, -1 in case of failure.
+ *
+ * Since: 9.1.0
+ */
+int
+virDomainPinMigrationThread(virDomainPtr domain,
+                            unsigned char *cpumap,
+                            int maplen)
+{
+    virConnectPtr conn;
+    g_autofree char *str = NULL;
+
+    VIR_DOMAIN_DEBUG(domain, "migration: cpumap=%p, maplen=%d",
+                     cpumap, maplen);
+
+    virResetLastError();
+
+    virCheckDomainReturn(domain, -1);
+    conn = domain->conn;
+
+    virCheckNonNullArgGoto(cpumap, error);
+    virCheckPositiveArgGoto(maplen, error);
+
+    str = virBitmapDataFormat(cpumap, maplen);
+    VIR_INFO("Begin to PinMigrationThread(domain=%s): new CPU Affinity:%s",
+             NULLSTR(domain->name), NULLSTR(str));
+
+    if (conn->driver->domainPinMigrationThread) {
+        int ret;
+        ret = conn->driver->domainPinMigrationThread(domain, cpumap, maplen);
+        if (ret < 0) {
+            VIR_ERROR(_("Failed to PinMigrationThread(domain=%s), ret=%d"),
+                        NULLSTR(domain->name), ret);
+            goto error;
+        }
+        VIR_INFO("Success to PinMigrationThread(domain=%s)", 
NULLSTR(domain->name));
+        return ret;
+    }
+
+    virReportUnsupportedError();
+
+ error:
+    virDispatchError(domain->conn);
+    return -1;
+}
diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
index 80742f268e..a5223786ed 100644
--- a/src/libvirt_public.syms
+++ b/src/libvirt_public.syms
@@ -932,4 +932,8 @@ LIBVIRT_9.0.0 {
         virDomainFDAssociate;
 } LIBVIRT_8.5.0;
 
+LIBVIRT_9.1.0 {
+    global:
+        virDomainPinMigrationThread;
+} LIBVIRT_9.0.0;
 # .... define new API here using predicted next version number ....
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index a4c60be3d7..54c5099731 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -8126,6 +8126,7 @@ static virHypervisorDriver hypervisor_driver = {
     .domainStartDirtyRateCalc = remoteDomainStartDirtyRateCalc, /* 7.2.0 */
     .domainSetLaunchSecurityState = remoteDomainSetLaunchSecurityState, /* 
8.0.0 */
     .domainFDAssociate = remoteDomainFDAssociate, /* 9.0.0 */
+    .domainPinMigrationThread = remoteDomainPinMigrationThread, /* 9.1.0 */
 };
 
 static virNetworkDriver network_driver = {
diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
index 5d86a51116..358e44bd14 100644
--- a/src/remote/remote_protocol.x
+++ b/src/remote/remote_protocol.x
@@ -3935,6 +3935,11 @@ struct remote_domain_fd_associate_args {
     remote_nonnull_string name;
     unsigned int flags;
 };
+
+struct remote_domain_pin_migration_thread_args {
+    remote_nonnull_domain dom;
+    opaque cpumap<REMOTE_CPUMAP_MAX>; /* (unsigned char *) */
+};
 /*----- Protocol. -----*/
 
 /* Define the program number, protocol version and procedure numbers here. */
@@ -6974,5 +6979,11 @@ enum remote_procedure {
      * @generate: none
      * @acl: domain:write
      */
-    REMOTE_PROC_DOMAIN_FD_ASSOCIATE = 443
+    REMOTE_PROC_DOMAIN_FD_ASSOCIATE = 443,
+
+    /**
+     * @generate: both
+     * @acl: domain:write
+     */
+    REMOTE_PROC_DOMAIN_PIN_MIGRATION_THREAD = 444
 };
diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs
index 3c6c230a16..a355f3a76b 100644
--- a/src/remote_protocol-structs
+++ b/src/remote_protocol-structs
@@ -3273,6 +3273,10 @@ struct remote_domain_fd_associate_args {
         remote_nonnull_string      name;
         u_int                      flags;
 };
+struct remote_domain_pin_migration_thread_args {
+        remote_nonnull_domain      dom;
+        opaque                     cpumap<REMOTE_CPUMAP_MAX>; /* (unsigned 
char *) */
+};
 enum remote_procedure {
         REMOTE_PROC_CONNECT_OPEN = 1,
         REMOTE_PROC_CONNECT_CLOSE = 2,
@@ -3717,4 +3721,5 @@ enum remote_procedure {
         REMOTE_PROC_DOMAIN_RESTORE_PARAMS = 441,
         REMOTE_PROC_DOMAIN_ABORT_JOB_FLAGS = 442,
         REMOTE_PROC_DOMAIN_FD_ASSOCIATE = 443,
+        REMOTE_PROC_DOMAIN_PIN_MIGRATION_THREAD = 444,
 };
-- 
2.33.0

Reply via email to