]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
cgroup: Implicit unit_invalidate_cgroup_members_masks
authorMichal Koutný <mkoutny@suse.com>
Mon, 1 Jun 2020 15:33:51 +0000 (17:33 +0200)
committerMichal Koutný <mkoutny@suse.com>
Wed, 19 Aug 2020 09:41:53 +0000 (11:41 +0200)
Merge members mask invalidation into
unit_add_siblings_to_cgroup_realize_queue, this way unit_realize_cgroup
needn't be called with members mask invalidation.

We have to retain the members mask invalidation in unit_load -- although
active units would have cgroups (re)realized (unit_load queues for
realization), the realization would happen with potentially stale mask.

src/core/cgroup.c
src/core/dbus-mount.c
src/core/dbus-scope.c
src/core/dbus-service.c
src/core/dbus-slice.c
src/core/dbus-socket.c
src/core/dbus-swap.c
src/core/unit.c

index 84512963a42c63202cec17b7e239bd8d1d462689..c1593107482c5d9ab4b50ab38a21f98b47e8b9ea 100644 (file)
@@ -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)
index bab12cc4ff15fa12242fc144501eab506dd5753c..a4fa44dbc990258a592a61d0c7d00f419c5a4590 100644 (file)
@@ -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;
index aecfda65356caa2e5f370b308371270bd3d4b156..d752cd58aa7774e149dc7e0107f926bed79930a3 100644 (file)
@@ -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;
index 3cc453dff5bbc7bb5a69a1b0742b682f95277e56..09f88b385b3bf5c29b33cc0d4c0829287a000338 100644 (file)
@@ -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;
index effd5fa5d76b7de0613f657bb42e68be76e226ae..28a6a4fe5a4c9b15f7e329710ab89f9226aec0ff 100644 (file)
@@ -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;
index f01489e29a16258610c5420906b5e13961ac3ddf..90a95c996da20940878ffb25cf5b27035358e85e 100644 (file)
@@ -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;
index cb4824b6bd943aa77f77a8655d23f3f2a3008e8d..d132c08f0ee6b9f033169378e231508c37b205cd 100644 (file)
@@ -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;
index c16e7562d88df3d1f873da3ae8b038f2523364c0..12465742fdb642711c04b27ee5d77fca1d9350a9 100644 (file)
@@ -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);