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

tangchen tangchen at cn.fujitsu.com
Wed Jul 25 05:25:16 UTC 2012


From: Tang Chen <tangchen at cn.fujitsu.com>

Hypervisor threads should also be pinned by sched_setaffinity(), just
the same as vcpu threads.

Signed-off-by: Tang Chen <tangchen at cn.fujitsu.com>
Signed-off-by: Hu Tao <hutao at cn.fujitsu.com>
---
 src/qemu/qemu_process.c |   54 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)

diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index d89b4d5..bb1640a 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -2005,6 +2005,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,
@@ -3765,6 +3815,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.10.2




More information about the libvir-list mailing list