This patch adds cpuset cgroup support for LXC.
Signed-off-by: Gao feng <gaofeng(a)cn.fujitsu.com>
---
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 fa47229..df468da 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 18f54e6..942e0fc 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 f19f8c1..37e3ce9 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;
--
1.7.11.7