[systemd-devel] [PATCH] cgroup: After MemmoryAccounting=yes running scope has no memusage

Stef Walter stef at thewalter.net
Tue Apr 8 03:11:04 PDT 2014


Setting the 'MemoryAccounting' unit property to true, puts the
unit into the right cgroup but does the memory.usage_in_bytes
does not reflect the pages already allocated to the processes
in that cgroup.

This is because the memory.move_charge_at_immigrate needs to be
set before migrating processes to the new cgroup memory
controller path:

https://www.kernel.org/doc/Documentation/cgroups/memory.txt

The attached path sets the memory.move_charge_at_immigrate to
0x01 | 0x02 before migrating processes to a new memory cgroup.
---
 src/core/cgroup.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/src/core/cgroup.c b/src/core/cgroup.c
index 3dd4c91..fcdbb07 100644
--- a/src/core/cgroup.c
+++ b/src/core/cgroup.c
@@ -26,6 +26,7 @@
 #include "special.h"
 #include "cgroup-util.h"
 #include "cgroup.h"
+#include "fileio.h"
 
 void cgroup_context_init(CGroupContext *c) {
         assert(c);
@@ -567,6 +568,8 @@ static const char *migrate_callback(CGroupControllerMask mask, void *userdata) {
 
 static int unit_create_cgroups(Unit *u, CGroupControllerMask mask) {
         _cleanup_free_ char *path = NULL;
+        _cleanup_free_ char *fs = NULL;
+        char c[DECIMAL_STR_MAX(pid_t) + 2];
         int r;
 
         assert(u);
@@ -596,6 +599,16 @@ static int unit_create_cgroups(Unit *u, CGroupControllerMask mask) {
         u->cgroup_realized = true;
         u->cgroup_realized_mask = mask;
 
+        /* Before migrating actually turn memory migration on */
+        if (mask & CGROUP_MEMORY) {
+                snprintf(c, sizeof(c), "%d\n", 3);
+                r = cg_get_path_and_check("memory", u->cgroup_path, "memory.move_charge_at_immigrate", &fs);
+                if (r >= 0)
+                        r = write_string_file(fs, c);
+                if (r < 0)
+                        log_error("Failed to set memory.move_change_at_immigrate on %s: %s", fs, strerror(-r));
+        }
+
         /* Then, possibly move things over */
         r = cg_migrate_everywhere(u->manager->cgroup_supported, u->cgroup_path, u->cgroup_path, migrate_callback, u);
         if (r < 0)
-- 
1.8.5.3



More information about the systemd-devel mailing list