This patch adds cpuset cgroup support for LXC.
also set cpuset cgroup before setting cpu
affinity and numa policy.
Signed-off-by: Gao feng <gaofeng(a)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;
--
1.7.11.7