[libvirt] [PATCH RESEND RFC v4 1/6] Introduce the function virCgroupForVcpu
Daniel Veillard
veillard at redhat.com
Thu Jul 21 04:02:54 UTC 2011
On Thu, Jul 21, 2011 at 10:08:03AM +0800, Wen Congyang wrote:
> Introduce the function virCgroupForVcpu() to create sub directory for each vcpu.
> ---
> src/libvirt_private.syms | 1 +
> src/util/cgroup.c | 72 ++++++++++++++++++++++++++++++++++++++++++---
> src/util/cgroup.h | 5 +++
> 3 files changed, 73 insertions(+), 5 deletions(-)
>
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 3e3b1dd..30804eb 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -67,6 +67,7 @@ virCgroupDenyAllDevices;
> virCgroupDenyDevicePath;
> virCgroupForDomain;
> virCgroupForDriver;
> +virCgroupForVcpu;
> virCgroupFree;
> virCgroupGetBlkioWeight;
> virCgroupGetCpuShares;
> diff --git a/src/util/cgroup.c b/src/util/cgroup.c
> index 740cedf..8994aca 100644
> --- a/src/util/cgroup.c
> +++ b/src/util/cgroup.c
> @@ -52,6 +52,16 @@ struct virCgroup {
> struct virCgroupController controllers[VIR_CGROUP_CONTROLLER_LAST];
> };
>
> +typedef enum {
> + VIR_CGROUP_NONE = 0, /* create subdir under each cgroup if possible. */
> + VIR_CGROUP_MEM_HIERACHY = 1 << 0, /* call virCgroupSetMemoryUseHierarchy
> + * before creating subcgroups and
> + * attaching tasks
> + */
> + VIR_CGROUP_VCPU = 1 << 1, /* create subdir only under the cgroup cpu,
> + * cpuacct and cpuset if possible. */
> +} virCgroupFlags;
> +
> /**
> * virCgroupFree:
> *
> @@ -503,7 +513,7 @@ static int virCgroupSetMemoryUseHierarchy(virCgroupPtr group)
> }
>
> static int virCgroupMakeGroup(virCgroupPtr parent, virCgroupPtr group,
> - int create, bool memory_hierarchy)
> + int create, unsigned int flags)
> {
> int i;
> int rc = 0;
> @@ -516,6 +526,13 @@ static int virCgroupMakeGroup(virCgroupPtr parent, virCgroupPtr group,
> if (!group->controllers[i].mountPoint)
> continue;
>
> + /* We need to control cpu bandwidth for each vcpu now */
> + if ((flags & VIR_CGROUP_VCPU) && i != VIR_CGROUP_CONTROLLER_CPU) {
small nit, I woudl put () on both side of the &&
> + /* treat it as unmounted and we can use virCgroupAddTask */
> + VIR_FREE(group->controllers[i].mountPoint);
> + continue;
> + }
> +
> rc = virCgroupPathOfController(group, i, "", &path);
> if (rc < 0)
> return rc;
> @@ -555,7 +572,7 @@ static int virCgroupMakeGroup(virCgroupPtr parent, virCgroupPtr group,
> * Note that virCgroupSetMemoryUseHierarchy should always be
> * called prior to creating subcgroups and attaching tasks.
> */
> - if (memory_hierarchy &&
> + if ((flags & VIR_CGROUP_MEM_HIERACHY) &&
> group->controllers[VIR_CGROUP_CONTROLLER_MEMORY].mountPoint != NULL &&
same here
> (i == VIR_CGROUP_CONTROLLER_MEMORY ||
> STREQ(group->controllers[i].mountPoint, group->controllers[VIR_CGROUP_CONTROLLER_MEMORY].mountPoint))) {
> @@ -641,7 +658,7 @@ static int virCgroupAppRoot(int privileged,
> if (rc != 0)
> goto cleanup;
>
> - rc = virCgroupMakeGroup(rootgrp, *group, create, false);
> + rc = virCgroupMakeGroup(rootgrp, *group, create, VIR_CGROUP_NONE);
>
> cleanup:
> virCgroupFree(&rootgrp);
> @@ -801,7 +818,7 @@ int virCgroupForDriver(const char *name,
> VIR_FREE(path);
>
> if (rc == 0) {
> - rc = virCgroupMakeGroup(rootgrp, *group, create, false);
> + rc = virCgroupMakeGroup(rootgrp, *group, create, VIR_CGROUP_NONE);
> if (rc != 0)
> virCgroupFree(group);
> }
> @@ -861,7 +878,7 @@ int virCgroupForDomain(virCgroupPtr driver,
> * a group for driver, is to avoid overhead to track
> * cumulative usage that we don't need.
> */
> - rc = virCgroupMakeGroup(driver, *group, create, true);
> + rc = virCgroupMakeGroup(driver, *group, create, VIR_CGROUP_MEM_HIERACHY);
> if (rc != 0)
> virCgroupFree(group);
> }
> @@ -879,6 +896,51 @@ int virCgroupForDomain(virCgroupPtr driver ATTRIBUTE_UNUSED,
> #endif
>
> /**
> + * virCgroupForVcpu:
> + *
> + * @driver: group for the domain
> + * @vcpuid: id of the vcpu
> + * @group: Pointer to returned virCgroupPtr
> + *
> + * Returns 0 on success
> + */
> +#if defined HAVE_MNTENT_H && defined HAVE_GETMNTENT_R
> +int virCgroupForVcpu(virCgroupPtr driver,
> + int vcpuid,
> + virCgroupPtr *group,
> + int create)
> +{
> + int rc;
> + char *path;
> +
> + if (driver == NULL)
> + return -EINVAL;
> +
> + if (virAsprintf(&path, "%s/vcpu%d", driver->path, vcpuid) < 0)
> + return -ENOMEM;
> +
> + rc = virCgroupNew(path, group);
> + VIR_FREE(path);
> +
> + if (rc == 0) {
> + rc = virCgroupMakeGroup(driver, *group, create, VIR_CGROUP_VCPU);
> + if (rc != 0)
> + virCgroupFree(group);
> + }
> +
> + return rc;
> +}
> +#else
> +int virCgroupForVcpu(virCgroupPtr driver ATTRIBUTE_UNUSED,
> + int vcpuid ATTRIBUTE_UNUSED,
> + virCgroupPtr *group ATTRIBUTE_UNUSED,
> + int create ATTRIBUTE_UNUSED)
> +{
> + return -ENXIO;
> +}
> +#endif
> +
> +/**
> * virCgroupSetBlkioWeight:
> *
> * @group: The cgroup to change io weight for
> diff --git a/src/util/cgroup.h b/src/util/cgroup.h
> index 8ae756d..1d04418 100644
> --- a/src/util/cgroup.h
> +++ b/src/util/cgroup.h
> @@ -40,6 +40,11 @@ int virCgroupForDomain(virCgroupPtr driver,
> virCgroupPtr *group,
> int create);
>
> +int virCgroupForVcpu(virCgroupPtr driver,
> + int vcpuid,
> + virCgroupPtr *group,
> + int create);
> +
> int virCgroupPathOfController(virCgroupPtr group,
> int controller,
> const char *key,
> --
> 1.7.1
ACK,
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list