[libvirt] [PATCH 4/4] LXC: add cpuset cgroup support for lxc

Gao feng gaofeng at cn.fujitsu.com
Mon Mar 18 02:27:43 UTC 2013


On 2013/03/15 17:24, Osier Yang wrote:
> On 2013年03月01日 14:52, Gao feng wrote:
>> This patch adds cpuset cgroup support for LXC.
>> also set cpuset cgroup before setting cpu
>> affinity and numa policy.
> 
> Any special reason to move lxcSetupCgroup before the CPU affinity
> and NUMA setttings?
> 

Through it has no functional difference which step is done first.
But consider sched_setaffinity will be affected by cpuset cgroup,
I think its better to set cpuset cgroup before we set CPU affinity.

I will add this reason into changelog.
>>
>> Signed-off-by: Gao feng<gaofeng at cn.fujitsu.com>
>> ---
>>   src/lxc/lxc_cgroup.c     | 57 +++++++++++++++++++++++++++++++++++++++++++++++-
>>   src/lxc/lxc_cgroup.h     |  2 +-
>>   src/lxc/lxc_controller.c |  6 ++---
>>   3 files changed, 60 insertions(+), 5 deletions(-)
>>
>> diff --git a/src/lxc/lxc_cgroup.c b/src/lxc/lxc_cgroup.c
>> index a075335..f94b914 100644
>> --- a/src/lxc/lxc_cgroup.c
>> +++ b/src/lxc/lxc_cgroup.c
>> @@ -68,6 +68,58 @@ cleanup:
>>   }
>>
>>
>> +static int virLXCCgroupSetupCpusetTune(virDomainDefPtr def,
>> +                                       virCgroupPtr cgroup,
>> +                                       virBitmapPtr nodemask)
>> +{
>> +    int rc = 0;
>> +    char *mask = NULL;
>> +
>> +    if (def->placement_mode != VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO&&
>> +        def->cpumask) {
>> +        mask = virBitmapFormat(def->cpumask);
>> +        if (!mask) {
>> +            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>> +                           _("failed to convert cpumask"));
>> +            return -1;
>> +        }
>> +
>> +        rc = virCgroupSetCpusetCpus(cgroup, mask);
>> +        VIR_FREE(mask);
>> +        if (rc<  0) {
>> +            virReportSystemError(-rc, "%s",
>> +                                 _("Unable to set cpuset.cpus"));
>> +        }
>> +    }
>> +
>> +    if ((def->numatune.memory.nodemask ||
>> +         (def->numatune.memory.placement_mode ==
>> +          VIR_DOMAIN_NUMATUNE_MEM_PLACEMENT_MODE_AUTO))&&
>> +          def->numatune.memory.mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT) {
>> +        if (def->numatune.memory.placement_mode ==
>> +            VIR_DOMAIN_NUMATUNE_MEM_PLACEMENT_MODE_AUTO)
>> +            mask = virBitmapFormat(nodemask);
>> +        else
>> +            mask = virBitmapFormat(def->numatune.memory.nodemask);
>> +
>> +        if (!mask) {
>> +            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
>> +                           _("failed to convert memory nodemask"));
>> +            return -1;
>> +        }
>> +
>> +        rc = virCgroupSetCpusetMems(cgroup, mask);
>> +        VIR_FREE(mask);
>> +        if (rc<  0) {
>> +            virReportSystemError(-rc, "%s",
>> +                                 _("Unable to set cpuset.mems"));
>> +        }
>> +    }
>> +
>> +    return rc;
>> +}
>> +
>> +
>>   static int virLXCCgroupSetupBlkioTune(virDomainDefPtr def,
>>                                         virCgroupPtr cgroup)
>>   {
>> @@ -472,7 +524,7 @@ cleanup:
>>   }
>>
>>
>> -int virLXCCgroupSetup(virDomainDefPtr def)
>> +int virLXCCgroupSetup(virDomainDefPtr def, virBitmapPtr nodemask)
>>   {
>>       virCgroupPtr driver = NULL;
>>       virCgroupPtr cgroup = NULL;
>> @@ -497,6 +549,9 @@ int virLXCCgroupSetup(virDomainDefPtr def)
>>       if (virLXCCgroupSetupCpuTune(def, cgroup)<  0)
>>           goto cleanup;
>>
>> +    if (virLXCCgroupSetupCpusetTune(def, cgroup, nodemask)<  0)
>> +        goto cleanup;
>> +
>>       if (virLXCCgroupSetupBlkioTune(def, cgroup)<  0)
>>           goto cleanup;
>>
>> diff --git a/src/lxc/lxc_cgroup.h b/src/lxc/lxc_cgroup.h
>> index fff554b..29f21d6 100644
>> --- a/src/lxc/lxc_cgroup.h
>> +++ b/src/lxc/lxc_cgroup.h
>> @@ -26,7 +26,7 @@
>>   # include "lxc_fuse.h"
>>   # include "virusb.h"
>>
>> -int virLXCCgroupSetup(virDomainDefPtr def);
>> +int virLXCCgroupSetup(virDomainDefPtr def, virBitmapPtr nodemask);
>>   int virLXCCgroupGetMeminfo(virLXCMeminfoPtr meminfo);
>>
>>   int
>> diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
>> index 3db0a88..75e2fe4 100644
>> --- a/src/lxc/lxc_controller.c
>> +++ b/src/lxc/lxc_controller.c
>> @@ -505,15 +505,15 @@ static int virLXCControllerSetupResourceLimits(virLXCControllerPtr ctrl)
>>       if (ret<  0)
>>           goto cleanup;
>>
>> -    ret = virLXCControllerSetupCpuAffinity(ctrl);
>> +    ret = virLXCCgroupSetup(ctrl->def, nodemask);
>>       if (ret<  0)
>>           goto cleanup;
>>
>> -    ret = virSetupNumaMemoryPolicy(ctrl->def->numatune, nodemask);
>> +    ret = virLXCControllerSetupCpuAffinity(ctrl);
>>       if (ret<  0)
>>           goto cleanup;
>>
>> -    ret = virLXCCgroupSetup(ctrl->def);
>> +    ret = virSetupNumaMemoryPolicy(ctrl->def->numatune, nodemask);
>>       if (ret<  0)
>>           goto cleanup;
>>
> 
> Looks good & ACK if there is a reasonble response on the question, but
> this needs to be rebased for comments in 1/4.
> 
Yes,of course, thanks for your comments again.




More information about the libvir-list mailing list