Skip to content

Commit 260fbcb

Browse files
committed
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>
1 parent 16dad78 commit 260fbcb

1 file changed

Lines changed: 5 additions & 4 deletions

File tree

kernel/cgroup/cgroup.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7019,18 +7019,19 @@ void cgroup_task_release(struct task_struct *task)
70197019
do_each_subsys_mask(ss, ssid, have_release_callback) {
70207020
ss->release(task);
70217021
} while_each_subsys_mask();
7022+
}
7023+
7024+
void cgroup_task_free(struct task_struct *task)
7025+
{
7026+
struct css_set *cset = task_css_set(task);
70227027

70237028
if (!list_empty(&task->cg_list)) {
70247029
spin_lock_irq(&css_set_lock);
70257030
css_set_skip_task_iters(task_css_set(task), task);
70267031
list_del_init(&task->cg_list);
70277032
spin_unlock_irq(&css_set_lock);
70287033
}
7029-
}
70307034

7031-
void cgroup_task_free(struct task_struct *task)
7032-
{
7033-
struct css_set *cset = task_css_set(task);
70347035
put_css_set(cset);
70357036
}
70367037

0 commit comments

Comments
 (0)