From: Michal Koutný Date: Wed, 4 Aug 2021 16:59:35 +0000 (+0200) Subject: core: Make sure cgroup_oom_queue is flushed on manager exit X-Git-Tag: v250-rc1~836^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=13e721036bf4ba15eb255d8f0a14800f969ac0d7;p=thirdparty%2Fsystemd.git core: Make sure cgroup_oom_queue is flushed on manager exit The unit queues are not serialized/deserialized (they are recreated after reexec/reload instead). The destroyed units are not removed from the cgroup_oom_queue. That means the queue may contain possibly invalid pointers to released units. Fix this by removing the units from cgroup_oom_queue as we do for others. When at it, sync assert checks with currently existing queues and put them in order in the manager cleanup code. --- diff --git a/src/core/manager.c b/src/core/manager.c index 24dfe9fc06b..f791df3766e 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 50a18820342..dba7a344b0b 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);