On Tue, Aug 21, 2012 at 05:18:33PM +0800, Hu Tao wrote: > From: Tang Chen <tangchen@xxxxxxxxxxxxxx> > > Introduce qemuSetupCgroupEmulatorPin() function to add emulator > threads pin info to cpuset cgroup, the same as vcpupin. > > Signed-off-by: Tang Chen <tangchen@xxxxxxxxxxxxxx> > Signed-off-by: Hu Tao <hutao@xxxxxxxxxxxxxx> > --- > src/qemu/qemu_cgroup.c | 51 ++++++++++++++++++++++++++++++++---------------- > src/qemu/qemu_cgroup.h | 1 + > 2 files changed, 35 insertions(+), 17 deletions(-) > > diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c > index 37874d3..9bebfd5 100644 > --- a/src/qemu/qemu_cgroup.c > +++ b/src/qemu/qemu_cgroup.c > @@ -496,29 +496,40 @@ int qemuSetupCgroupVcpuPin(virCgroupPtr cgroup, > int nvcpupin, > int vcpuid) > { > - int i, rc = 0; > - char *new_cpus = NULL; > + int i; > > for (i = 0; i < nvcpupin; i++) { > if (vcpuid == vcpupin[i]->vcpuid) { > - new_cpus = virDomainCpuSetFormat(vcpupin[i]->cpumask, > - VIR_DOMAIN_CPUMASK_LEN); > - if (!new_cpus) { > - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > - _("failed to convert cpu mask")); > - rc = -1; > - goto cleanup; > - } > - rc = virCgroupSetCpusetCpus(cgroup, new_cpus); > - if (rc != 0) { > - virReportSystemError(-rc, > - "%s", > - _("Unable to set cpuset.cpus")); > - goto cleanup; > - } > + return qemuSetupCgroupEmulatorPin(cgroup, vcpupin[i]); > } > } > > + return -1; > +} > + > +int qemuSetupCgroupEmulatorPin(virCgroupPtr cgroup, > + virDomainVcpuPinDefPtr vcpupin) > +{ > + int rc = 0; > + char *new_cpus = NULL; > + > + new_cpus = virDomainCpuSetFormat(vcpupin->cpumask, > + VIR_DOMAIN_CPUMASK_LEN); > + if (!new_cpus) { > + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", > + _("failed to convert cpu mask")); > + rc = -1; > + goto cleanup; > + } > + > + rc = virCgroupSetCpusetCpus(cgroup, new_cpus); > + if (rc < 0) { > + virReportSystemError(-rc, > + "%s", > + _("Unable to set cpuset.cpus")); > + goto cleanup; > + } > + > cleanup: > VIR_FREE(new_cpus); > return rc; > @@ -636,6 +647,7 @@ int qemuSetupCgroupForEmulator(struct qemud_driver *driver, > { > virCgroupPtr cgroup = NULL; > virCgroupPtr cgroup_emulator = NULL; > + virDomainDefPtr def = vm->def; > int rc, i; > > if (driver->cgroup == NULL) > @@ -672,6 +684,11 @@ int qemuSetupCgroupForEmulator(struct qemud_driver *driver, > } > } > > + if (def->cputune.emulatorpin && > + qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_CPUSET) && > + qemuSetupCgroupEmulatorPin(cgroup_emulator, def->cputune.emulatorpin) < 0) > + goto cleanup; > + > virCgroupFree(&cgroup_emulator); > virCgroupFree(&cgroup); > return 0; > diff --git a/src/qemu/qemu_cgroup.h b/src/qemu/qemu_cgroup.h > index fa93cdb..04f70a1 100644 > --- a/src/qemu/qemu_cgroup.h > +++ b/src/qemu/qemu_cgroup.h > @@ -57,6 +57,7 @@ int qemuSetupCgroupVcpuPin(virCgroupPtr cgroup, > virDomainVcpuPinDefPtr *vcpupin, > int nvcpupin, > int vcpuid); > +int qemuSetupCgroupEmulatorPin(virCgroupPtr cgroup, virDomainVcpuPinDefPtr vcpupin); > int qemuSetupCgroupForVcpu(struct qemud_driver *driver, virDomainObjPtr vm); > int qemuSetupCgroupForEmulator(struct qemud_driver *driver, > virDomainObjPtr vm); 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