]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
LXC: add cpuset cgroup support for lxc
authorGao feng <gaofeng@cn.fujitsu.com>
Wed, 20 Mar 2013 03:35:09 +0000 (11:35 +0800)
committerOsier Yang <jyang@redhat.com>
Wed, 20 Mar 2013 11:37:16 +0000 (19:37 +0800)
This patch adds cpuset cgroup support for LXC.

Signed-off-by: Gao feng <gaofeng@cn.fujitsu.com>
src/lxc/lxc_cgroup.c
src/lxc/lxc_cgroup.h
src/lxc/lxc_controller.c

index fa47229a5d6f2e5a7812b77094197f0b943dd1c8..df468dadfa5b5315134162c33cfa3dae8da0eafc 100644 (file)
@@ -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;
 
index 18f54e630a8985e1bbe3dab5ce7ef73ee819c154..942e0fc4a7768aa43e157978fdd3d2d73c3dbb5c 100644 (file)
@@ -28,7 +28,9 @@
 
 virCgroupPtr virLXCCgroupCreate(virDomainDefPtr def);
 int virLXCCgroupSetup(virDomainDefPtr def,
-                      virCgroupPtr cgroup);
+                      virCgroupPtr cgroup,
+                      virBitmapPtr nodemask);
+
 int virLXCCgroupGetMeminfo(virLXCMeminfoPtr meminfo);
 
 int
index f19f8c1da69d7954f0c98ba59dcfefdef78f2899..37e3ce94cb584c9dc7313604930a00c5e1042710 100644 (file)
@@ -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;