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

Gao feng gaofeng at cn.fujitsu.com
Wed Feb 27 08:09:38 UTC 2013


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 at 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




More information about the libvir-list mailing list