]> git.ipfire.org Git - thirdparty/kernel/linux.git/commit
cgroup: Move dying_tasks cleanup from cgroup_task_release() to cgroup_task_free()
authorTejun Heo <tj@kernel.org>
Wed, 29 Oct 2025 06:19:16 +0000 (20:19 -1000)
committerTejun Heo <tj@kernel.org>
Mon, 3 Nov 2025 21:46:18 +0000 (11:46 -1000)
commit260fbcb92bbeacfcd050410fdc2d24ab15044400
tree6bbd144f84f812294933ce4cafd12313e1c719c5
parent16dad7801aad73138a2dff5ea950130646914d1f
cgroup: Move dying_tasks cleanup from cgroup_task_release() to cgroup_task_free()

Currently, cgroup_task_exit() adds thread group leaders with live member
threads to their css_set's dying_tasks list (so cgroup.procs iteration can
still see the leader), and cgroup_task_release() later removes them with
list_del_init(&task->cg_list).

An upcoming patch will defer the dying_tasks list addition, moving it from
cgroup_task_exit() (called from do_exit()) to a new function called from
finish_task_switch(). However, release_task() (which calls
cgroup_task_release()) can run either before or after finish_task_switch(),
creating a race where cgroup_task_release() might try to remove the task from
dying_tasks before or while it's being added.

Move the list_del_init() from cgroup_task_release() to cgroup_task_free() to
fix this race. cgroup_task_free() runs from __put_task_struct(), which is
always after both paths, making the cleanup safe.

Cc: Dan Schatzberg <dschatzberg@meta.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Tejun Heo <tj@kernel.org>
kernel/cgroup/cgroup.c