diff --git a/src/core/cgroup.c b/src/core/cgroup.c index 84512963a4..c159310748 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -2319,6 +2319,8 @@ void unit_add_siblings_to_cgroup_realize_queue(Unit *u) { /* This adds the path from the specified unit to root slice to the queue and siblings at each level. * The unit itself is excluded (assuming it's handled separately). + * The function must invalidate cgroup_members_mask of all ancestors in order to calculate up to date + * masks. * * Propagation of realization "side-ways" (i.e. towards siblings) is relevant on cgroup-v1 where * scheduling becomes very weird if two units that own processes reside in the same slice, but one is @@ -2333,6 +2335,9 @@ void unit_add_siblings_to_cgroup_realize_queue(Unit *u) { Unit *m; void *v; + /* Children of slice likely changed when we're called */ + slice->cgroup_members_mask_valid = false; + HASHMAP_FOREACH_KEY(v, m, slice->dependencies[UNIT_BEFORE], i) { /* Skip units that have a dependency on the slice but aren't actually in it. */ if (UNIT_DEREF(m->slice) != slice) diff --git a/src/core/dbus-mount.c b/src/core/dbus-mount.c index bab12cc4ff..a4fa44dbc9 100644 --- a/src/core/dbus-mount.c +++ b/src/core/dbus-mount.c @@ -149,7 +149,6 @@ int bus_mount_set_property( int bus_mount_commit_properties(Unit *u) { assert(u); - unit_invalidate_cgroup_members_masks(u); unit_realize_cgroup(u); return 0; diff --git a/src/core/dbus-scope.c b/src/core/dbus-scope.c index aecfda6535..d752cd58aa 100644 --- a/src/core/dbus-scope.c +++ b/src/core/dbus-scope.c @@ -190,7 +190,6 @@ int bus_scope_set_property( int bus_scope_commit_properties(Unit *u) { assert(u); - unit_invalidate_cgroup_members_masks(u); unit_realize_cgroup(u); return 0; diff --git a/src/core/dbus-service.c b/src/core/dbus-service.c index 3cc453dff5..09f88b385b 100644 --- a/src/core/dbus-service.c +++ b/src/core/dbus-service.c @@ -457,7 +457,6 @@ int bus_service_set_property( int bus_service_commit_properties(Unit *u) { assert(u); - unit_invalidate_cgroup_members_masks(u); unit_realize_cgroup(u); return 0; diff --git a/src/core/dbus-slice.c b/src/core/dbus-slice.c index effd5fa5d7..28a6a4fe5a 100644 --- a/src/core/dbus-slice.c +++ b/src/core/dbus-slice.c @@ -28,7 +28,6 @@ int bus_slice_set_property( int bus_slice_commit_properties(Unit *u) { assert(u); - unit_invalidate_cgroup_members_masks(u); unit_realize_cgroup(u); return 0; diff --git a/src/core/dbus-socket.c b/src/core/dbus-socket.c index f01489e29a..90a95c996d 100644 --- a/src/core/dbus-socket.c +++ b/src/core/dbus-socket.c @@ -469,7 +469,6 @@ int bus_socket_set_property( int bus_socket_commit_properties(Unit *u) { assert(u); - unit_invalidate_cgroup_members_masks(u); unit_realize_cgroup(u); return 0; diff --git a/src/core/dbus-swap.c b/src/core/dbus-swap.c index cb4824b6bd..d132c08f0e 100644 --- a/src/core/dbus-swap.c +++ b/src/core/dbus-swap.c @@ -70,7 +70,6 @@ int bus_swap_set_property( int bus_swap_commit_properties(Unit *u) { assert(u); - unit_invalidate_cgroup_members_masks(u); unit_realize_cgroup(u); return 0; diff --git a/src/core/unit.c b/src/core/unit.c index c16e7562d8..12465742fd 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -664,10 +664,8 @@ void unit_free(Unit *u) { /* A unit is being dropped from the tree, make sure our siblings and ancestor slices are realized * properly. Do this after we detach the unit from slice tree in order to eliminate its effect on * controller masks. */ - if (UNIT_ISSET(u->slice)) { - unit_invalidate_cgroup_members_masks(UNIT_DEREF(u->slice)); + if (UNIT_ISSET(u->slice)) unit_add_siblings_to_cgroup_realize_queue(u); - } if (u->on_console) manager_unref_console(u->manager);