From 1a3704dcc3960b4ba29045f20017e4211229db70 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 24 Apr 2023 10:19:28 +0200 Subject: 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. --- src/nspawn/nspawn-cgroup.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'src/nspawn') 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); -- cgit v1.2.1