From: Peter Morrow Date: Thu, 16 Sep 2021 11:21:20 +0000 (+0100) Subject: cgroup: re-evaluate startup units during shutdown as well X-Git-Tag: v250-rc1~617^2~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9dfb6a3a8e1183a7988691377fe7bf747ff38bc0;p=thirdparty%2Fsystemd.git cgroup: re-evaluate startup units during shutdown as well Apply startup cgroup configuration options to the shutdown phase as well. I.e. all directives prefixed with Startup are applied during boot and shutdown. For example: StartupAllowedCPU= applies during boot and shutdown. AllowedCPUs= applies during normal runtime. --- diff --git a/src/core/cgroup.c b/src/core/cgroup.c index 17e93d7af17..c19454e8bdd 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -68,6 +68,25 @@ bool manager_owns_host_root_cgroup(Manager *m) { return empty_or_root(m->cgroup_root); } +bool unit_has_startup_cgroup_constraints(Unit *u) { + assert(u); + + /* Returns true if this unit has any directives which apply during + * startup/shutdown phases. */ + + CGroupContext *c; + + c = unit_get_cgroup_context(u); + if (!c) + return false; + + return c->startup_cpu_shares != CGROUP_CPU_SHARES_INVALID || + c->startup_io_weight != CGROUP_WEIGHT_INVALID || + c->startup_blockio_weight != CGROUP_BLKIO_WEIGHT_INVALID || + c->startup_cpuset_cpus.set || + c->startup_cpuset_mems.set; +} + bool unit_has_host_root_cgroup(Unit *u) { assert(u); @@ -844,7 +863,7 @@ static bool cgroup_context_has_allowed_mems(CGroupContext *c) { } static uint64_t cgroup_context_cpu_weight(CGroupContext *c, ManagerState state) { - if (IN_SET(state, MANAGER_STARTING, MANAGER_INITIALIZING) && + if (IN_SET(state, MANAGER_STARTING, MANAGER_INITIALIZING, MANAGER_STOPPING) && c->startup_cpu_weight != CGROUP_WEIGHT_INVALID) return c->startup_cpu_weight; else if (c->cpu_weight != CGROUP_WEIGHT_INVALID) @@ -854,7 +873,7 @@ static uint64_t cgroup_context_cpu_weight(CGroupContext *c, ManagerState state) } static uint64_t cgroup_context_cpu_shares(CGroupContext *c, ManagerState state) { - if (IN_SET(state, MANAGER_STARTING, MANAGER_INITIALIZING) && + if (IN_SET(state, MANAGER_STARTING, MANAGER_INITIALIZING, MANAGER_STOPPING) && c->startup_cpu_shares != CGROUP_CPU_SHARES_INVALID) return c->startup_cpu_shares; else if (c->cpu_shares != CGROUP_CPU_SHARES_INVALID) @@ -864,7 +883,7 @@ static uint64_t cgroup_context_cpu_shares(CGroupContext *c, ManagerState state) } static CPUSet *cgroup_context_allowed_cpus(CGroupContext *c, ManagerState state) { - if (IN_SET(state, MANAGER_STARTING, MANAGER_INITIALIZING) && + if (IN_SET(state, MANAGER_STARTING, MANAGER_INITIALIZING, MANAGER_STOPPING) && c->startup_cpuset_cpus.set) return &c->startup_cpuset_cpus; else @@ -872,7 +891,7 @@ static CPUSet *cgroup_context_allowed_cpus(CGroupContext *c, ManagerState state) } static CPUSet *cgroup_context_allowed_mems(CGroupContext *c, ManagerState state) { - if (IN_SET(state, MANAGER_STARTING, MANAGER_INITIALIZING) && + if (IN_SET(state, MANAGER_STARTING, MANAGER_INITIALIZING, MANAGER_STOPPING) && c->startup_cpuset_mems.set) return &c->startup_cpuset_mems; else @@ -993,7 +1012,7 @@ static bool cgroup_context_has_blockio_config(CGroupContext *c) { } static uint64_t cgroup_context_io_weight(CGroupContext *c, ManagerState state) { - if (IN_SET(state, MANAGER_STARTING, MANAGER_INITIALIZING) && + if (IN_SET(state, MANAGER_STARTING, MANAGER_INITIALIZING, MANAGER_STOPPING) && c->startup_io_weight != CGROUP_WEIGHT_INVALID) return c->startup_io_weight; else if (c->io_weight != CGROUP_WEIGHT_INVALID) @@ -1003,7 +1022,7 @@ static uint64_t cgroup_context_io_weight(CGroupContext *c, ManagerState state) { } static uint64_t cgroup_context_blkio_weight(CGroupContext *c, ManagerState state) { - if (IN_SET(state, MANAGER_STARTING, MANAGER_INITIALIZING) && + if (IN_SET(state, MANAGER_STARTING, MANAGER_INITIALIZING, MANAGER_STOPPING) && c->startup_blockio_weight != CGROUP_BLKIO_WEIGHT_INVALID) return c->startup_blockio_weight; else if (c->blockio_weight != CGROUP_BLKIO_WEIGHT_INVALID) @@ -3971,7 +3990,7 @@ void manager_invalidate_startup_units(Manager *m) { assert(m); SET_FOREACH(u, m->startup_units) - unit_invalidate_cgroup(u, CGROUP_MASK_CPU|CGROUP_MASK_IO|CGROUP_MASK_BLKIO); + unit_invalidate_cgroup(u, CGROUP_MASK_CPU|CGROUP_MASK_IO|CGROUP_MASK_BLKIO|CGROUP_MASK_CPUSET); } static int unit_get_nice(Unit *u) { diff --git a/src/core/cgroup.h b/src/core/cgroup.h index 951ddda525a..8795f2724eb 100644 --- a/src/core/cgroup.h +++ b/src/core/cgroup.h @@ -311,6 +311,8 @@ int unit_reset_accounting(Unit *u); bool manager_owns_host_root_cgroup(Manager *m); bool unit_has_host_root_cgroup(Unit *u); +bool unit_has_startup_cgroup_constraints(Unit *u); + int manager_notify_cgroup_empty(Manager *m, const char *group); void unit_invalidate_cgroup(Unit *u, CGroupMask m); diff --git a/src/core/job.c b/src/core/job.c index 6eb135785b1..6dd01a6f49d 100644 --- a/src/core/job.c +++ b/src/core/job.c @@ -1335,6 +1335,8 @@ void job_shutdown_magic(Job *j) { /* In case messages on console has been disabled on boot */ j->unit->manager->no_console_output = false; + manager_invalidate_startup_units(j->unit->manager); + if (detect_container() > 0) return; diff --git a/src/core/unit.c b/src/core/unit.c index 1a76abf8a16..4fd499a4f1d 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -1557,15 +1557,7 @@ static int unit_add_oomd_dependencies(Unit *u) { } static int unit_add_startup_units(Unit *u) { - CGroupContext *c; - - c = unit_get_cgroup_context(u); - if (!c) - return 0; - - if (c->startup_cpu_shares == CGROUP_CPU_SHARES_INVALID && - c->startup_io_weight == CGROUP_WEIGHT_INVALID && - c->startup_blockio_weight == CGROUP_BLKIO_WEIGHT_INVALID) + if (!unit_has_startup_cgroup_constraints(u)) return 0; return set_ensure_put(&u->manager->startup_units, NULL, u);