summaryrefslogtreecommitdiff
path: root/src/nspawn
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2023-04-24 10:19:28 +0200
committerLennart Poettering <lennart@poettering.net>2023-04-27 12:18:32 +0200
commit1a3704dcc3960b4ba29045f20017e4211229db70 (patch)
treee18a5ca679f724de1fa12df6b3cac626d1bec64e /src/nspawn
parentf8371dbd56d27621932ecbe3f5c1246e925fd53a (diff)
downloadsystemd-1a3704dcc3960b4ba29045f20017e4211229db70.tar.gz
nspawn: port over to /supervisor/ subcgroup being delegated to nspawn
Let's make use of the new DelegateSubgroup= feature and delegate the /supervisor/ subcgroup already to nspawn, so that moving the supervisor process there is unnecessary.
Diffstat (limited to 'src/nspawn')
-rw-r--r--src/nspawn/nspawn-cgroup.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/nspawn/nspawn-cgroup.c b/src/nspawn/nspawn-cgroup.c
index 0deb4ebb30..a9d36627a8 100644
--- a/src/nspawn/nspawn-cgroup.c
+++ b/src/nspawn/nspawn-cgroup.c
@@ -141,9 +141,9 @@ finish:
}
int create_subcgroup(pid_t pid, bool keep_unit, CGroupUnified unified_requested) {
- _cleanup_free_ char *cgroup = NULL;
+ _cleanup_free_ char *cgroup = NULL, *payload = NULL;
CGroupMask supported;
- const char *payload;
+ char *e;
int r;
assert(pid > 1);
@@ -174,15 +174,26 @@ int create_subcgroup(pid_t pid, bool keep_unit, CGroupUnified unified_requested)
if (r < 0)
return log_error_errno(r, "Failed to get our control group: %m");
- payload = strjoina(cgroup, "/payload");
+ /* If the service manager already placed us in the supervisor cgroup, let's handle that. */
+ e = endswith(cgroup, "/supervisor");
+ if (e)
+ *e = 0; /* chop off, we want the main path delegated to us */
+
+ payload = path_join(cgroup, "payload");
+ if (!payload)
+ return log_oom();
+
r = cg_create_and_attach(SYSTEMD_CGROUP_CONTROLLER, payload, pid);
if (r < 0)
return log_error_errno(r, "Failed to create %s subcgroup: %m", payload);
if (keep_unit) {
- const char *supervisor;
+ _cleanup_free_ char *supervisor = NULL;
+
+ supervisor = path_join(cgroup, "supervisor");
+ if (!supervisor)
+ return log_oom();
- supervisor = strjoina(cgroup, "/supervisor");
r = cg_create_and_attach(SYSTEMD_CGROUP_CONTROLLER, supervisor, 0);
if (r < 0)
return log_error_errno(r, "Failed to create %s subcgroup: %m", supervisor);