mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-08 15:04:45 +00:00
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 <oleg@redhat.com> Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
parent
1805c1729f
commit
6fe960147e
@ -6701,8 +6701,10 @@ void cgroup_exit(struct task_struct *tsk)
|
|||||||
WARN_ON_ONCE(list_empty(&tsk->cg_list));
|
WARN_ON_ONCE(list_empty(&tsk->cg_list));
|
||||||
cset = task_css_set(tsk);
|
cset = task_css_set(tsk);
|
||||||
css_set_move_task(tsk, cset, NULL, false);
|
css_set_move_task(tsk, cset, NULL, false);
|
||||||
list_add_tail(&tsk->cg_list, &cset->dying_tasks);
|
|
||||||
cset->nr_tasks--;
|
cset->nr_tasks--;
|
||||||
|
/* matches the signal->live check in css_task_iter_advance() */
|
||||||
|
if (thread_group_leader(tsk) && atomic_read(&tsk->signal->live))
|
||||||
|
list_add_tail(&tsk->cg_list, &cset->dying_tasks);
|
||||||
|
|
||||||
if (dl_task(tsk))
|
if (dl_task(tsk))
|
||||||
dec_dl_tasks_cs(tsk);
|
dec_dl_tasks_cs(tsk);
|
||||||
@ -6729,10 +6731,12 @@ void cgroup_release(struct task_struct *task)
|
|||||||
ss->release(task);
|
ss->release(task);
|
||||||
} while_each_subsys_mask();
|
} while_each_subsys_mask();
|
||||||
|
|
||||||
spin_lock_irq(&css_set_lock);
|
if (!list_empty(&task->cg_list)) {
|
||||||
css_set_skip_task_iters(task_css_set(task), task);
|
spin_lock_irq(&css_set_lock);
|
||||||
list_del_init(&task->cg_list);
|
css_set_skip_task_iters(task_css_set(task), task);
|
||||||
spin_unlock_irq(&css_set_lock);
|
list_del_init(&task->cg_list);
|
||||||
|
spin_unlock_irq(&css_set_lock);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cgroup_free(struct task_struct *task)
|
void cgroup_free(struct task_struct *task)
|
||||||
|
Loading…
Reference in New Issue
Block a user