[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH 07/13] Add qemuProcessSetHypervisorAffinites and set hypervisor threads affinities



Signed-off-by: Tang Chen <tangchen cn fujitsu com>
---
 src/qemu/qemu_process.c |   54 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 54 insertions(+), 0 deletions(-)

diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 31c2c30..e73cc92 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -1965,6 +1965,56 @@ cleanup:
     return ret;
 }
 
+/* Set CPU affinities for hypervisor threads if hypervisorpin xml provided. */
+static int
+qemuProcessSetHypervisorAffinites(virConnectPtr conn,
+                                  virDomainObjPtr vm)
+{
+    virDomainDefPtr def = vm->def;
+    pid_t pid = vm->pid;
+    unsigned char *cpumask = NULL;
+    unsigned char *cpumap = NULL;
+    virNodeInfo nodeinfo;
+    int cpumaplen, hostcpus, maxcpu, i;
+    int ret = -1;
+
+    if (virNodeGetInfo(conn, &nodeinfo) != 0)
+        return -1;
+
+    if (!def->cputune.hypervisorpin)
+        return 0;
+
+    hostcpus = VIR_NODEINFO_MAXCPUS(nodeinfo);
+    cpumaplen = VIR_CPU_MAPLEN(hostcpus);
+    maxcpu = cpumaplen * 8;
+
+    if (maxcpu > hostcpus)
+        maxcpu = hostcpus;
+
+    if (VIR_ALLOC_N(cpumap, cpumaplen) < 0) {
+        virReportOOMError();
+        return -1;
+    }
+
+    cpumask = (unsigned char *)def->cputune.hypervisorpin->cpumask;
+    for(i = 0; i < VIR_DOMAIN_CPUMASK_LEN; i++) {
+        if (cpumask[i])
+            VIR_USE_CPU(cpumap, i);
+    }
+
+    if (virProcessInfoSetAffinity(pid,
+                                  cpumap,
+                                  cpumaplen,
+                                  maxcpu) < 0) {
+        goto cleanup;
+    }
+
+    ret = 0;
+cleanup:
+    VIR_FREE(cpumap);
+    return ret;
+}
+
 static int
 qemuProcessInitPasswords(virConnectPtr conn,
                          struct qemud_driver *driver,
@@ -3682,6 +3732,10 @@ int qemuProcessStart(virConnectPtr conn,
     if (qemuProcessSetVcpuAffinites(conn, vm) < 0)
         goto cleanup;
 
+    VIR_DEBUG("Setting hypervisor threads affinities");
+    if (qemuProcessSetHypervisorAffinites(conn, vm) < 0)
+        goto cleanup;
+
     VIR_DEBUG("Setting any required VM passwords");
     if (qemuProcessInitPasswords(conn, driver, vm) < 0)
         goto cleanup;
-- 
1.7.3.1


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]