From 4dceffadc9080a836468ea3f20a8bb31dcc4895d Mon Sep 17 00:00:00 2001 From: Gao feng Date: Wed, 20 Mar 2013 11:35:09 +0800 Subject: [PATCH] LXC: add cpuset cgroup support for lxc This patch adds cpuset cgroup support for LXC. Signed-off-by: Gao feng --- src/lxc/lxc_cgroup.c | 57 +++++++++++++++++++++++++++++++++++++++- src/lxc/lxc_cgroup.h | 4 ++- src/lxc/lxc_controller.c | 2 +- 3 files changed, 60 insertions(+), 3 deletions(-) diff --git a/src/lxc/lxc_cgroup.c b/src/lxc/lxc_cgroup.c index fa47229a5d..df468dadfa 100644 --- a/src/lxc/lxc_cgroup.c +++ b/src/lxc/lxc_cgroup.c @@ -68,6 +68,57 @@ 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); + if (rc < 0) { + virReportSystemError(-rc, "%s", + _("Unable to set cpuset.cpus")); + goto cleanup; + } + } + + if ((def->numatune.memory.nodemask || + (def->numatune.memory.placement_mode == + VIR_NUMA_TUNE_MEM_PLACEMENT_MODE_AUTO)) && + def->numatune.memory.mode == VIR_DOMAIN_NUMATUNE_MEM_STRICT) { + if (def->numatune.memory.placement_mode == + VIR_NUMA_TUNE_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); + if (rc < 0) + virReportSystemError(-rc, "%s", _("Unable to set cpuset.mems")); + } + +cleanup: + VIR_FREE(mask); + return rc; +} + + static int virLXCCgroupSetupBlkioTune(virDomainDefPtr def, virCgroupPtr cgroup) { @@ -516,13 +567,17 @@ cleanup: int virLXCCgroupSetup(virDomainDefPtr def, - virCgroupPtr cgroup) + virCgroupPtr cgroup, + virBitmapPtr nodemask) { int ret = -1; 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 18f54e630a..942e0fc4a7 100644 --- a/src/lxc/lxc_cgroup.h +++ b/src/lxc/lxc_cgroup.h @@ -28,7 +28,9 @@ virCgroupPtr virLXCCgroupCreate(virDomainDefPtr def); int virLXCCgroupSetup(virDomainDefPtr def, - virCgroupPtr cgroup); + virCgroupPtr cgroup, + virBitmapPtr nodemask); + int virLXCCgroupGetMeminfo(virLXCMeminfoPtr meminfo); int diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c index f19f8c1da6..37e3ce94cb 100644 --- a/src/lxc/lxc_controller.c +++ b/src/lxc/lxc_controller.c @@ -569,7 +569,7 @@ static int virLXCControllerSetupResourceLimits(virLXCControllerPtr ctrl, if (virLXCControllerSetupCpuAffinity(ctrl) < 0) goto cleanup; - if (virLXCCgroupSetup(ctrl->def, cgroup) < 0) + if (virLXCCgroupSetup(ctrl->def, cgroup, nodemask) < 0) goto cleanup; ret = 0;