Skip to content

Commit 6fe9601

Browse files
oleg-nesterovhtejun
authored andcommitted
cgroup: avoid the unnecessary list_add(dying_tasks) in cgroup_exit()
cgroup_exit() needs to do this only if the exiting task is a leader and it is not the last live thread. The patch doesn't use delay_group_leader(), atomic_read(signal->live) matches the code css_task_iter_advance() more. cgroup_release() can now check list_empty(task->cg_list) before it takes css_set_lock and calls ss_set_skip_task_iters(). Signed-off-by: Oleg Nesterov <[email protected]> Signed-off-by: Tejun Heo <[email protected]>
1 parent 1805c17 commit 6fe9601

File tree

1 file changed

+9
-5
lines changed

1 file changed

+9
-5
lines changed

kernel/cgroup/cgroup.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6701,8 +6701,10 @@ void cgroup_exit(struct task_struct *tsk)
67016701
WARN_ON_ONCE(list_empty(&tsk->cg_list));
67026702
cset = task_css_set(tsk);
67036703
css_set_move_task(tsk, cset, NULL, false);
6704-
list_add_tail(&tsk->cg_list, &cset->dying_tasks);
67056704
cset->nr_tasks--;
6705+
/* matches the signal->live check in css_task_iter_advance() */
6706+
if (thread_group_leader(tsk) && atomic_read(&tsk->signal->live))
6707+
list_add_tail(&tsk->cg_list, &cset->dying_tasks);
67066708

67076709
if (dl_task(tsk))
67086710
dec_dl_tasks_cs(tsk);
@@ -6729,10 +6731,12 @@ void cgroup_release(struct task_struct *task)
67296731
ss->release(task);
67306732
} while_each_subsys_mask();
67316733

6732-
spin_lock_irq(&css_set_lock);
6733-
css_set_skip_task_iters(task_css_set(task), task);
6734-
list_del_init(&task->cg_list);
6735-
spin_unlock_irq(&css_set_lock);
6734+
if (!list_empty(&task->cg_list)) {
6735+
spin_lock_irq(&css_set_lock);
6736+
css_set_skip_task_iters(task_css_set(task), task);
6737+
list_del_init(&task->cg_list);
6738+
spin_unlock_irq(&css_set_lock);
6739+
}
67366740
}
67376741

67386742
void cgroup_free(struct task_struct *task)

0 commit comments

Comments
 (0)