diff --git a/src/core/cgroup.c b/src/core/cgroup.c index da821465da..bbeb5b2f50 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -3031,6 +3031,9 @@ static int unit_check_cgroup_events(Unit *u) { assert(u); + if (!u->cgroup_path) + return 0; + r = cg_get_keyed_attribute_graceful(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, "cgroup.events", STRV_MAKE("populated", "frozen"), values); if (r < 0) @@ -3863,6 +3866,21 @@ void unit_invalidate_cgroup_bpf(Unit *u) { } } +void unit_cgroup_catchup(Unit *u) { + assert(u); + + if (!UNIT_HAS_CGROUP_CONTEXT(u)) + return; + + /* We dropped the inotify watch during reexec/reload, so we need to + * check these as they may have changed. + * Note that (currently) the kernel doesn't actually update cgroup + * file modification times, so we can't just serialize and then check + * the mtime for file(s) we are interested in. */ + (void) unit_check_cgroup_events(u); + unit_add_to_cgroup_oom_queue(u); +} + bool unit_cgroup_delegate(Unit *u) { CGroupContext *c; diff --git a/src/core/cgroup.h b/src/core/cgroup.h index ea929368cb..3f8cad899d 100644 --- a/src/core/cgroup.h +++ b/src/core/cgroup.h @@ -313,6 +313,8 @@ void manager_invalidate_startup_units(Manager *m); const char* cgroup_device_policy_to_string(CGroupDevicePolicy i) _const_; CGroupDevicePolicy cgroup_device_policy_from_string(const char *s) _pure_; +void unit_cgroup_catchup(Unit *u); + bool unit_cgroup_delegate(Unit *u); int compare_job_priority(const void *a, const void *b); diff --git a/src/core/manager.c b/src/core/manager.c index 677b08e098..e67f320bca 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -1437,6 +1437,10 @@ static void manager_clear_jobs_and_units(Manager *m) { assert(!m->cleanup_queue); assert(!m->gc_unit_queue); assert(!m->gc_job_queue); + assert(!m->cgroup_realize_queue); + assert(!m->cgroup_empty_queue); + assert(!m->cgroup_oom_queue); + assert(!m->target_deps_queue); assert(!m->stop_when_unneeded_queue); assert(!m->start_when_upheld_queue); assert(!m->stop_when_bound_queue); diff --git a/src/core/unit.c b/src/core/unit.c index 5cc66ab164..1b9fb079b4 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -733,6 +733,9 @@ Unit* unit_free(Unit *u) { if (u->in_dbus_queue) LIST_REMOVE(dbus_queue, u->manager->dbus_unit_queue, u); + if (u->in_cleanup_queue) + LIST_REMOVE(cleanup_queue, u->manager->cleanup_queue, u); + if (u->in_gc_queue) LIST_REMOVE(gc_queue, u->manager->gc_unit_queue, u); @@ -742,8 +745,8 @@ Unit* unit_free(Unit *u) { if (u->in_cgroup_empty_queue) LIST_REMOVE(cgroup_empty_queue, u->manager->cgroup_empty_queue, u); - if (u->in_cleanup_queue) - LIST_REMOVE(cleanup_queue, u->manager->cleanup_queue, u); + if (u->in_cgroup_oom_queue) + LIST_REMOVE(cgroup_oom_queue, u->manager->cgroup_oom_queue, u); if (u->in_target_deps_queue) LIST_REMOVE(target_deps_queue, u->manager->target_deps_queue, u); @@ -3611,6 +3614,8 @@ void unit_catchup(Unit *u) { if (UNIT_VTABLE(u)->catchup) UNIT_VTABLE(u)->catchup(u); + + unit_cgroup_catchup(u); } static bool fragment_mtime_newer(const char *path, usec_t mtime, bool path_masked) {