summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuca Boccassi <bluca@debian.org>2023-01-21 00:00:38 +0100
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2023-01-23 21:40:54 +0100
commit020b2e41ea776cff73392da8084a0725b590d245 (patch)
tree3a77af1420cdd8dca15ec49f5123229415f668c2
parentbuild: add some coloring to --version output (diff)
downloadsystemd-020b2e41ea776cff73392da8084a0725b590d245.tar.xz
systemd-020b2e41ea776cff73392da8084a0725b590d245.zip
core: ensure init.scope is realized after drop-ins have been loaded
If we add a drop-in for init.scope (e.g.: to set some memory limit), it will be loaded long after the cgroup has already been realized. Do it again when creating the special unit.
-rw-r--r--src/core/cgroup.c2
-rw-r--r--src/core/cgroup.h1
-rw-r--r--src/core/scope.c4
-rwxr-xr-xtest/TEST-55-OOMD/test.sh6
-rwxr-xr-xtest/units/testsuite-55.sh3
5 files changed, 15 insertions, 1 deletions
diff --git a/src/core/cgroup.c b/src/core/cgroup.c
index 7f3782ae41..4cac3f6a89 100644
--- a/src/core/cgroup.c
+++ b/src/core/cgroup.c
@@ -2528,7 +2528,7 @@ static bool unit_has_mask_enables_realized(
((u->cgroup_enabled_mask | enable_mask) & CGROUP_MASK_V2) == (u->cgroup_enabled_mask & CGROUP_MASK_V2);
}
-static void unit_add_to_cgroup_realize_queue(Unit *u) {
+void unit_add_to_cgroup_realize_queue(Unit *u) {
assert(u);
if (u->in_cgroup_realize_queue)
diff --git a/src/core/cgroup.h b/src/core/cgroup.h
index a6a3d186ac..d137e3af4f 100644
--- a/src/core/cgroup.h
+++ b/src/core/cgroup.h
@@ -264,6 +264,7 @@ int unit_realize_cgroup(Unit *u);
void unit_prune_cgroup(Unit *u);
int unit_watch_cgroup(Unit *u);
int unit_watch_cgroup_memory(Unit *u);
+void unit_add_to_cgroup_realize_queue(Unit *u);
void unit_release_cgroup(Unit *u);
/* Releases the cgroup only if it is recursively empty.
diff --git a/src/core/scope.c b/src/core/scope.c
index e2fc4cc995..914d1cc744 100644
--- a/src/core/scope.c
+++ b/src/core/scope.c
@@ -789,6 +789,10 @@ static void scope_enumerate_perpetual(Manager *m) {
unit_add_to_load_queue(u);
unit_add_to_dbus_queue(u);
+ /* Enqueue an explicit cgroup realization here. Unlike other cgroups this one already exists and is
+ * populated (by us, after all!) already, even when we are not in a reload cycle. Hence we cannot
+ * apply the settings at creation time anymore, but let's at least apply them asynchronously. */
+ unit_add_to_cgroup_realize_queue(u);
}
static const char* const scope_result_table[_SCOPE_RESULT_MAX] = {
diff --git a/test/TEST-55-OOMD/test.sh b/test/TEST-55-OOMD/test.sh
index 4dc414294c..4032896061 100755
--- a/test/TEST-55-OOMD/test.sh
+++ b/test/TEST-55-OOMD/test.sh
@@ -17,6 +17,12 @@ test_append_files() {
cat >>"${initdir:?}/etc/fstab" <<EOF
UUID=$(blkid -o value -s UUID "${LOOPDEV}p2") none swap defaults 0 0
EOF
+
+ mkdir -p "${initdir:?}/etc/systemd/system/init.scope.d/"
+ cat >>"${initdir:?}/etc/systemd/system/init.scope.d/test-55-oomd.conf" <<EOF
+[Scope]
+MemoryHigh=10G
+EOF
)
}
diff --git a/test/units/testsuite-55.sh b/test/units/testsuite-55.sh
index 8fa1d01fd0..0887eac08f 100755
--- a/test/units/testsuite-55.sh
+++ b/test/units/testsuite-55.sh
@@ -5,6 +5,9 @@ set -o pipefail
systemd-analyze log-level debug
+# Ensure that the init.scope.d drop-in is applied on boot
+test "$(cat /sys/fs/cgroup/init.scope/memory.high)" != "max"
+
# Loose checks to ensure the environment has the necessary features for systemd-oomd
[[ -e /proc/pressure ]] || echo "no PSI" >>/skipped
cgroup_type="$(stat -fc %T /sys/fs/cgroup/)"