[libvirt] [PATCH 2/2] cgroup: Enable memory.use_hierarchy of cgroup for domain

Ryota Ozaki ozaki.ryota at gmail.com
Wed Jun 23 12:03:40 UTC 2010


On Wed, Jun 23, 2010 at 6:50 AM, Eric Blake <eblake at redhat.com> wrote:
> On 05/23/2010 07:15 AM, Ryota Ozaki wrote:
>
> [Apologies for the delayed review, and for the fact that you had to ping
> us to remind us this had not been visited]

Nevermind. I'm also sometimes late ;-)

>
>> Through conversation with Kumar L Srikanth-B22348, I found
>> that the function of getting memory usage (e.g., virsh dominfo)
>> doesn't work for lxc with ns subsystem of cgroup enabled.
>>
>> This is because of features of ns and memory subsystems.
>> Ns creates child cgroup on every process fork and as a result
>> processes in a container are not assigned in a cgroup for
>> domain (e.g., libvirt/lxc/test1/). For example, libvirt_lxc
>> and init (or somewhat specified in XML) are assigned into
>> libvirt/lxc/test1/8839/ and libvirt/lxc/test1/8839/8849/,
>> respectively. On the other hand, memory subsystem accounts
>> memory usage within a group of processes by default, i.e.,
>> it does not take any child (and descendent) groups into
>> account. With the two features, virsh dominfo which just
>> checks memory usage of a cgroup for domain always returns
>> zero because the cgroup has no process.
>>
>> Setting memory.use_hierarchy of a group allows to account
>> (and limit) memory usage of every descendent groups of the group.
>
> s/descendent/descendant/

ouch.

>
>> By setting it of a cgroup for domain, we can get proper memory
>> usage of lxc with ns subsystem enabled. (To be exact, the
>> setting is required only when memory and ns subsystems are
>> enabled at the same time, e.g., mount -t cgroup none /cgroup.)
>> ---
>>  src/util/cgroup.c |   63 +++++++++++++++++++++++++++++++++++++++++++++++++---
>>  1 files changed, 59 insertions(+), 4 deletions(-)
>>
>> diff --git a/src/util/cgroup.c b/src/util/cgroup.c
>> index b8b2eb5..f7d6b41 100644
>> --- a/src/util/cgroup.c
>> +++ b/src/util/cgroup.c
>> @@ -443,7 +443,38 @@ static int virCgroupCpuSetInherit(virCgroupPtr parent, virCgroupPtr group)
>>      return rc;
>>  }
>>
>> -static int virCgroupMakeGroup(virCgroupPtr parent, virCgroupPtr group, int create)
>> +static int virCgroupSetMemoryUseHierarchy(virCgroupPtr group)
>> +{
>> +    int rc = 0;
>> +    unsigned long long value;
>> +    const char *filename = "memory.use_hierarchy";
>> +
>> +    rc = virCgroupGetValueU64(group,
>> +                              VIR_CGROUP_CONTROLLER_MEMORY,
>> +                              filename, &value);
>> +    if (rc != 0) {
>> +        VIR_ERROR("Failed to read %s/%s (%d)", group->path, filename, rc);
>
> Needs _() translation these days; 'make syntax-check' should have caught
> this.

Oh, sorry. I'll fix all you mention in this patch as well as missing ones in
the previous patch.

>
>> +        return rc;
>> +    }
>> +
>> +    /* Setting twice causes error, so if already enabled, skip setting */
>> +    if (value == 1)
>> +        return 0;
>> +
>> +    VIR_DEBUG("Setting up %s/%s", group->path, filename);
>
> Debug remains untranslated...
>
>> +    rc = virCgroupSetValueU64(group,
>> +                              VIR_CGROUP_CONTROLLER_MEMORY,
>> +                              filename, 1);
>> +
>> +    if (rc != 0) {
>> +        VIR_ERROR("Failed to set %s/%s (%d)", group->path, filename, rc);
>
> ...but another VIR_ERROR that needs translation.
>
>> +    }
>> +
>> +    return rc;
>> +}
>> +
>> +static int virCgroupMakeGroup(virCgroupPtr parent, virCgroupPtr group,
>> +                              int create, int memory_hierarchy)
>
> Based on how this is being used, it seems like you should use
> bool/true/false rather than int/0/1 for memory_hierarchy.

Indeed. Will fix.

>
>>  {
>>      int i;
>>      int rc = 0;
>> @@ -477,6 +508,20 @@ static int virCgroupMakeGroup(virCgroupPtr parent, virCgroupPtr group, int creat
>>                      break;
>>                  }
>>              }
>> +            /*
>> +             * Note that virCgroupSetMemoryUseHierarchy should always be
>> +             * called prior to creating subcgroups and attaching tasks.
>> +             */
>> +            if (memory_hierarchy &&
>> +                group->controllers[VIR_CGROUP_CONTROLLER_MEMORY].mountPoint != NULL &&
>> +                (i == VIR_CGROUP_CONTROLLER_MEMORY ||
>> +                 STREQ(group->controllers[i].mountPoint, group->controllers[VIR_CGROUP_CONTROLLER_MEMORY].mountPoint))) {
>> +                rc = virCgroupSetMemoryUseHierarchy(group);
>> +                if (rc != 0) {
>> +                    VIR_FREE(path);
>> +                    break;
>> +                }
>> +            }
>>          }
>>
>>          VIR_FREE(path);
>> @@ -553,7 +598,7 @@ static int virCgroupAppRoot(int privileged,
>>      if (rc != 0)
>>          goto cleanup;
>>
>> -    rc = virCgroupMakeGroup(rootgrp, *group, create);
>> +    rc = virCgroupMakeGroup(rootgrp, *group, create, 0);
>>
>
> ACK with those nits addressed.  Hopefully a v2 submission won't take as
> much time on the review side of things.

Thanks.
  ozaki-r

>
> --
> Eric Blake   eblake at redhat.com    +1-801-349-2682
> Libvirt virtualization library http://libvirt.org
>
>




More information about the libvir-list mailing list