this patch adds cpuset support for LXC.
also set cpuset cgroup before we set 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 | 25 +++++++++++++--------
3 files changed, 73 insertions(+), 11 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 c52c947..bd0678e 100644
--- a/src/lxc/lxc_controller.c
+++ b/src/lxc/lxc_controller.c
@@ -493,21 +493,28 @@ static int virLXCControllerSetupCpuAffinity(virLXCControllerPtr
ctrl)
*/
static int virLXCControllerSetupResourceLimits(virLXCControllerPtr ctrl)
{
+ int ret;
virBitmapPtr nodemask = NULL;
- if (virLXCControllerGetNumadAdvice(ctrl, &nodemask) < 0)
- return -1;
+ ret = virLXCControllerGetNumadAdvice(ctrl, &nodemask);
+ if (ret < 0)
+ goto cleanup;
- if (virLXCControllerSetupCpuAffinity(ctrl) < 0)
- return -1;
+ ret = virLXCCgroupSetup(ctrl->def, nodemask);
+ if (ret < 0)
+ goto cleanup;
- if (virDomainSetupNumaMemoryPolicy(ctrl->def, nodemask) < 0) {
- virBitmapFree(nodemask);
- return -1;
- }
+ ret = virLXCControllerSetupCpuAffinity(ctrl);
+ if (ret < 0)
+ goto cleanup;
+
+ ret = virDomainSetupNumaMemoryPolicy(ctrl->def, nodemask);
+ if (ret < 0)
+ goto cleanup;
+cleanup:
virBitmapFree(nodemask);
- return virLXCCgroupSetup(ctrl->def);
+ return ret;
}
--
1.7.11.7