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