cgroup: immediately remove all cgroups which run empty

Some controllers have scaling problems when many empty cgroups exist.
Hence, as soon as we get a notification that a cgroup is empty, delete
it. This is also nice to keep the systemd-cgls output short.
This commit is contained in:
Lennart Poettering 2011-11-03 19:42:53 +01:00
parent 263653e103
commit 353fa6a21a

View File

@ -363,7 +363,8 @@ int cgroup_notify_empty(Manager *m, const char *group) {
assert(m); assert(m);
assert(group); assert(group);
if (!(l = hashmap_get(m->cgroup_bondings, group))) l = hashmap_get(m->cgroup_bondings, group);
if (!l)
return 0; return 0;
LIST_FOREACH(by_path, b, l) { LIST_FOREACH(by_path, b, l) {
@ -372,7 +373,8 @@ int cgroup_notify_empty(Manager *m, const char *group) {
if (!b->unit) if (!b->unit)
continue; continue;
if ((t = cgroup_bonding_is_empty_list(b)) < 0) { t = cgroup_bonding_is_empty_list(b);
if (t < 0) {
/* If we don't know, we don't know */ /* If we don't know, we don't know */
if (t != -EAGAIN) if (t != -EAGAIN)
@ -381,9 +383,13 @@ int cgroup_notify_empty(Manager *m, const char *group) {
continue; continue;
} }
if (t > 0) if (t > 0) {
/* If it is empty, let's delete it */
cgroup_bonding_trim_list(b->unit->meta.cgroup_bondings, true);
if (UNIT_VTABLE(b->unit)->cgroup_notify_empty) if (UNIT_VTABLE(b->unit)->cgroup_notify_empty)
UNIT_VTABLE(b->unit)->cgroup_notify_empty(b->unit); UNIT_VTABLE(b->unit)->cgroup_notify_empty(b->unit);
}
} }
return 0; return 0;