/* 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
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)
int bus_mount_commit_properties(Unit *u) {
assert(u);
- unit_invalidate_cgroup_members_masks(u);
unit_realize_cgroup(u);
return 0;
int bus_scope_commit_properties(Unit *u) {
assert(u);
- unit_invalidate_cgroup_members_masks(u);
unit_realize_cgroup(u);
return 0;
int bus_service_commit_properties(Unit *u) {
assert(u);
- unit_invalidate_cgroup_members_masks(u);
unit_realize_cgroup(u);
return 0;
int bus_slice_commit_properties(Unit *u) {
assert(u);
- unit_invalidate_cgroup_members_masks(u);
unit_realize_cgroup(u);
return 0;
int bus_socket_commit_properties(Unit *u) {
assert(u);
- unit_invalidate_cgroup_members_masks(u);
unit_realize_cgroup(u);
return 0;
int bus_swap_commit_properties(Unit *u) {
assert(u);
- unit_invalidate_cgroup_members_masks(u);
unit_realize_cgroup(u);
return 0;
/* 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);