On Tue, Aug 21, 2012 at 05:18:34PM +0800, Hu Tao wrote: > From: Tang Chen <tangchen@xxxxxxxxxxxxxx> > > Emulator threads should also be pinned by sched_setaffinity(), just > the same as vcpu threads. > > Signed-off-by: Tang Chen <tangchen@xxxxxxxxxxxxxx> > Signed-off-by: Hu Tao <hutao@xxxxxxxxxxxxxx> > --- > 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 762f298..90d44c4 100644 > --- a/src/qemu/qemu_process.c > +++ b/src/qemu/qemu_process.c > @@ -2002,6 +2002,56 @@ cleanup: > return ret; > } > > +/* Set CPU affinities for emulator threads if emulatorpin xml provided. */ > +static int > +qemuProcessSetEmulatorAffinites(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.emulatorpin) > + return 0; > + > + hostcpus = VIR_NODEINFO_MAXCPUS(nodeinfo); > + cpumaplen = VIR_CPU_MAPLEN(hostcpus); > + maxcpu = cpumaplen * CHAR_BIT; > + > + if (maxcpu > hostcpus) > + maxcpu = hostcpus; > + > + if (VIR_ALLOC_N(cpumap, cpumaplen) < 0) { > + virReportOOMError(); > + return -1; > + } > + > + cpumask = (unsigned char *)def->cputune.emulatorpin->cpumask; > + for(i = 0; i < VIR_DOMAIN_CPUMASK_LEN; i++) { missing space between for and ( > + 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, > @@ -3764,6 +3814,10 @@ int qemuProcessStart(virConnectPtr conn, > if (qemuProcessSetVcpuAffinites(conn, vm) < 0) > goto cleanup; > > + VIR_DEBUG("Setting affinity of emulator threads"); > + if (qemuProcessSetEmulatorAffinites(conn, vm) < 0) > + goto cleanup; > + > VIR_DEBUG("Setting any required VM passwords"); > if (qemuProcessInitPasswords(conn, driver, vm) < 0) > goto cleanup; Looks okay, ACK, Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@xxxxxxxxxxxx | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/ -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list