[libvirt] [PATCH 09/12] Adding memtunables to qemuSetupCgroup

Nikunj A. Dadhania nikunj at linux.vnet.ibm.com
Mon Sep 20 08:47:52 UTC 2010


QEmu startup would pick up the memory tunables specified in the domain
configuration file.

Signed-off-by: Nikunj A. Dadhania <nikunj at linux.vnet.ibm.com>
---
 src/qemu/qemu.conf     |    4 ++--
 src/qemu/qemu_conf.c   |    3 ++-
 src/qemu/qemu_driver.c |   27 +++++++++++++++++++++++++++
 3 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/src/qemu/qemu.conf b/src/qemu/qemu.conf
index dc8eb83..bfb9f6a 100644
--- a/src/qemu/qemu.conf
+++ b/src/qemu/qemu.conf
@@ -111,13 +111,13 @@
 # the adminsitrator has mounted cgroups. eg
 #
 #  mkdir /dev/cgroup
-#  mount -t cgroup -o devices,cpu none /dev/cgroup
+#  mount -t cgroup -o devices,cpu,memory none /dev/cgroup
 #
 # They can be mounted anywhere, and different controlers
 # can be mounted in different locations. libvirt will detect
 # where they are located.
 #
-# cgroup_controllers = [ "cpu", "devices" ]
+# cgroup_controllers = [ "cpu", "devices", "memory" ]
 
 # This is the basic set of devices allowed / required by
 # all virtual machines.
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 731c554..3f5c1ac 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -275,7 +275,8 @@ int qemudLoadDriverConfig(struct qemud_driver *driver,
     } else {
         driver->cgroupControllers =
             (1 << VIR_CGROUP_CONTROLLER_CPU) |
-            (1 << VIR_CGROUP_CONTROLLER_DEVICES);
+            (1 << VIR_CGROUP_CONTROLLER_DEVICES) | 
+            (1 << VIR_CGROUP_CONTROLLER_MEMORY);
     }
     for (i = 0 ; i < VIR_CGROUP_CONTROLLER_LAST ; i++) {
         if (driver->cgroupControllers & (1 << i)) {
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 06666e9..99ce52f 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3495,6 +3495,33 @@ static int qemuSetupCgroup(struct qemud_driver *driver,
             goto cleanup;
     }
 
+    if ((rc = qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_MEMORY))) {
+        rc = virCgroupSetMemoryHardLimit(cgroup, vm->def->mem.hard_limit);
+        if (rc != 0) {
+            virReportSystemError(-rc,
+                                 _("Unable to set memory hard limit for domain %s"),
+                                 vm->def->name);
+            goto cleanup;
+        }
+        rc = virCgroupSetMemorySoftLimit(cgroup, vm->def->mem.soft_limit);
+        if (rc != 0) {
+            virReportSystemError(-rc,
+                                 _("Unable to set memory soft limit for domain %s"),
+                                 vm->def->name);
+            goto cleanup;
+        }
+        rc = virCgroupSetSwapHardLimit(cgroup, vm->def->mem.swap_hard_limit);
+        if (rc != 0) {
+            virReportSystemError(-rc,
+                                 _("Unable to set swap hard limit for domain %s"),
+                                 vm->def->name);
+            goto cleanup;
+        }
+    } else {
+        VIR_WARN("Memory cgroup is disabled in qemu configuration file: %s",
+                 vm->def->name);
+    }
+
 done:
     virCgroupFree(&cgroup);
     return 0;




More information about the libvir-list mailing list