diff options
author | Simon Wilson <simonwilson@google.com> | 2011-01-07 18:46:34 -0800 |
---|---|---|
committer | Colin Cross <ccross@android.com> | 2011-01-10 16:16:51 -0800 |
commit | 78d2a8274115727ab3864584abee09d3021de9c6 (patch) | |
tree | 0d4f5ed6fff1fff9568e3a5c65e9ab1168560727 /kernel | |
parent | 5947e496b6dea68354785458a3bb07b5ca78ae85 (diff) |
cgroup: leave cg_list valid upon cgroup_exit
A thread/process in cgroup_attach_task() could have called
list_del(&tsk->cg_list) after cgroup_exit() had already called
list_del() on the same list. Since it only checked for
!list_empty(&tsk->cg_list) before doing this, the list_del()
call would thus be made twice.
The solution is to leave tsk->cg_list in a valid state in
cgroup_exit() with list_del_init(&tsk->cg_list), which leaves
an empty list.
Change-Id: I4e7c1d0665fced629f5ca033c18dd98afe080e0c
Signed-off-by: Simon Wilson <simonwilson@google.com>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/cgroup.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 3f1552c7ee11..cc2a04ed3cc5 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c @@ -4177,7 +4177,7 @@ void cgroup_exit(struct task_struct *tsk, int run_callbacks) if (!list_empty(&tsk->cg_list)) { write_lock(&css_set_lock); if (!list_empty(&tsk->cg_list)) - list_del(&tsk->cg_list); + list_del_init(&tsk->cg_list); write_unlock(&css_set_lock); } |