Signed-off-by: Tang Chen <tangchen(a)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