[libvirt] [PATCH 04/13] Enable cpuset cgroup and synchronous vcpupin info to cgroup
Eric Blake
eblake at redhat.com
Tue Jul 3 00:00:52 UTC 2012
On 06/05/2012 02:17 AM, tangchen wrote:
> This patch enables cpuset cgroup, and synchronous vcpupin info set by sched_setaffinity() to cgroup.
>
This doesn't really give many details about what you are trying to do here.
> Signed-off-by: Tang Chen <tangchen at cn.fujitsu.com>
> ---
> src/libvirt_private.syms | 2 +
> src/qemu/qemu_cgroup.c | 51 ++++++++++++++++++++++++++++++++++++++++++++-
> src/qemu/qemu_cgroup.h | 2 +
> src/qemu/qemu_driver.c | 43 +++++++++++++++++++++++++++++++-------
> src/util/cgroup.c | 35 ++++++++++++++++++++++++++++++-
> src/util/cgroup.h | 3 ++
> 6 files changed, 125 insertions(+), 11 deletions(-)
>
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 6ff1a3b..88cc37a 100644
> --- a/src/libvirt_private.syms
> +++ b/src/qemu/qemu_cgroup.c
> @@ -473,18 +473,57 @@ cleanup:
> rc = virCgroupSetCpuCfsPeriod(cgroup, old_period);
> if (rc < 0)
> virReportSystemError(-rc,
> - _("%s"),
> - "Unable to rollback cpu bandwidth period");
> + "%s",
> + _("Unable to rollback cpu bandwidth period"));
This hunk is an independent bug fix, and should be pushed separately. I
will take care of that shortly.
> }
>
> return -1;
> }
>
> +int qemuSetupCgroupVcpuPin(virCgroupPtr cgroup, virDomainDefPtr def,
> + int vcpuid)
> +{
> + int i, rc;
> + char *new_cpus = NULL;
> +
> + if (vcpuid < 0 || vcpuid >= def->vcpus) {
> + virReportSystemError(EINVAL,
> + "%s: %d", _("invalid vcpuid"), vcpuid);
I would write this:
virReportSystemError(EINVAL,
_("invalid vcpuid: %d"), vcpuid);
> + return -1;
> + }
> +
> + for (i = 0; i < def->cputune.nvcpupin; i++) {
> + if (vcpuid == def->cputune.vcpupin[i]->vcpuid) {
> + new_cpus = virDomainCpuSetFormat(def->cputune.vcpupin[i]->cpumask,
> + VIR_DOMAIN_CPUMASK_LEN);
> + if (!new_cpus) {
> + qemuReportError(VIR_ERR_INTERNAL_ERROR,
> + _("failed to convert cpu mask"));
> + goto cleanup;
> + }
> + rc = virCgroupSetCpusetCpus(cgroup, new_cpus);
> + if (rc < 0) {
> + virReportSystemError(-rc,
> + "%s", _("Unable to set cpuset.cpus"));
> + goto cleanup;
> + }
> + }
> + }
> + VIR_FREE(new_cpus);
> + return 0;
> +
> +cleanup:
> + if (new_cpus)
> + VIR_FREE(new_cpus);
This fails 'make syntax-check':
src/qemu/qemu_cgroup.c: if (new_cpus)
VIR_FREE(new_cpus);
maint.mk: found useless "if" before "free" above
> + return -1;
> +}
And since you call VIR_FREE(new_cpus) on both success and failure path,
I'd consolidate things. Declare this up front:
int ret = -1;
then the tail of the function becomes:
ret = 0;
cleanup:
VIR_FREE(new_cpus);
return ret;
}
> @@ -556,6 +595,14 @@ int qemuSetupCgroupForVcpu(struct qemud_driver *driver, virDomainObjPtr vm)
> }
> }
>
> + /* Set vcpupin in cgroup if vcpupin xml is provided */
> + if (def->cputune.nvcpupin) {
> + if (qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_CPUSET)) {
> + if (qemuSetupCgroupVcpuPin(cgroup_vcpu, def, i) < 0)
> + goto cleanup;
Rather than nesting this deeply, you could use &&, as in:
if (def->cputune.nvcpupin &&
qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_CPUSET) &&
qemuSetupCgroupVcpuPin(cgroup_vcpu, def, i) < 0)
goto cleanup;
> @@ -3605,9 +3607,37 @@ qemudDomainPinVcpuFlags(virDomainPtr dom,
> if (flags & VIR_DOMAIN_AFFECT_LIVE) {
>
> if (priv->vcpupids != NULL) {
> + /* Add config to vm->def first, because cgroup APIs need it. */
> + if (virDomainVcpuPinAdd(vm->def, cpumap, maplen, vcpu) < 0) {
> + qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("failed to update or add vcpupin xml of "
> + "a running domain"));
> + goto cleanup;
> + }
> +
> + /* Configure the corresponding cpuset cgroup before set affinity. */
> + if (qemuCgroupControllerActive(driver,
> + VIR_CGROUP_CONTROLLER_CPUSET)) {
> + if (virCgroupForDomain(driver->cgroup, vm->def->name,
> + &cgroup_dom, 0) == 0) {
> + if (virCgroupForVcpu(cgroup_dom, vcpu, &cgroup_vcpu, 0) == 0) {
> + if (qemuSetupCgroupVcpuPin(cgroup_vcpu, vm->def, vcpu) < 0) {
> + qemuReportError(VIR_ERR_OPERATION_INVALID, "%s %d",
> + _("failed to set cpuset.cpus in cgroup"
> + " for vcpu"), vcpu);
Another place where I would embed the %d into the message, as in:
_("failed to set cpuset.cpus in cgroup for vcpu %d"), vcpu
> + goto cleanup;
> + }
> + }
> + }
> + }
> +
> if (virProcessInfoSetAffinity(priv->vcpupids[vcpu],
> - cpumap, maplen, maxcpu) < 0)
> + cpumap, maplen, maxcpu) < 0) {
> + qemuReportError(VIR_ERR_SYSTEM_ERROR, "%s %d",
> + _("failed to set cpu affinity for vcpu"),
> + vcpu);
and again
--
Eric Blake eblake at redhat.com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 620 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20120702/35a1a880/attachment-0001.sig>
More information about the libvir-list
mailing list