Michal Schmidt e43452
From 54a91c5eae72181cc7aadf618c152e18ac336b5e Mon Sep 17 00:00:00 2001
Michal Schmidt e43452
From: Lennart Poettering <lennart@poettering.net>
Michal Schmidt e43452
Date: Thu, 3 Nov 2011 19:42:53 +0100
Michal Schmidt f1996e
Subject: [PATCH] cgroup: immediately remove all cgroups which run empty
Michal Schmidt e43452
Michal Schmidt e43452
Some controllers have scaling problems when many empty cgroups exist.
Michal Schmidt e43452
Hence, as soon as we get a notification that a cgroup is empty, delete
Michal Schmidt e43452
it. This is also nice to keep the systemd-cgls output short.
Michal Schmidt e43452
(cherry picked from commit 353fa6a21aab96b0b82ab40cc22b08b1fb0bf652)
Michal Schmidt e43452
---
Michal Schmidt e43452
 src/cgroup.c |   12 +++++++++---
Michal Schmidt e43452
 1 files changed, 9 insertions(+), 3 deletions(-)
Michal Schmidt e43452
Michal Schmidt e43452
diff --git a/src/cgroup.c b/src/cgroup.c
Michal Schmidt e43452
index be837c3..4bbb54f 100644
Michal Schmidt e43452
--- a/src/cgroup.c
Michal Schmidt e43452
+++ b/src/cgroup.c
Michal Schmidt e43452
@@ -363,7 +363,8 @@ int cgroup_notify_empty(Manager *m, const char *group) {
Michal Schmidt e43452
         assert(m);
Michal Schmidt e43452
         assert(group);
Michal Schmidt e43452
 
Michal Schmidt e43452
-        if (!(l = hashmap_get(m->cgroup_bondings, group)))
Michal Schmidt e43452
+        l = hashmap_get(m->cgroup_bondings, group);
Michal Schmidt e43452
+        if (!l)
Michal Schmidt e43452
                 return 0;
Michal Schmidt e43452
 
Michal Schmidt e43452
         LIST_FOREACH(by_path, b, l) {
Michal Schmidt e43452
@@ -372,7 +373,8 @@ int cgroup_notify_empty(Manager *m, const char *group) {
Michal Schmidt e43452
                 if (!b->unit)
Michal Schmidt e43452
                         continue;
Michal Schmidt e43452
 
Michal Schmidt e43452
-                if ((t = cgroup_bonding_is_empty_list(b)) < 0) {
Michal Schmidt e43452
+                t = cgroup_bonding_is_empty_list(b);
Michal Schmidt e43452
+                if (t < 0) {
Michal Schmidt e43452
 
Michal Schmidt e43452
                         /* If we don't know, we don't know */
Michal Schmidt e43452
                         if (t != -EAGAIN)
Michal Schmidt e43452
@@ -381,9 +383,13 @@ int cgroup_notify_empty(Manager *m, const char *group) {
Michal Schmidt e43452
                         continue;
Michal Schmidt e43452
                 }
Michal Schmidt e43452
 
Michal Schmidt e43452
-                if (t > 0)
Michal Schmidt e43452
+                if (t > 0) {
Michal Schmidt e43452
+                        /* If it is empty, let's delete it */
Michal Schmidt e43452
+                        cgroup_bonding_trim_list(b->unit->meta.cgroup_bondings, true);
Michal Schmidt e43452
+
Michal Schmidt e43452
                         if (UNIT_VTABLE(b->unit)->cgroup_notify_empty)
Michal Schmidt e43452
                                 UNIT_VTABLE(b->unit)->cgroup_notify_empty(b->unit);
Michal Schmidt e43452
+                }
Michal Schmidt e43452
         }
Michal Schmidt e43452
 
Michal Schmidt e43452
         return 0;