aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Wilson <simonwilson@google.com>2011-01-07 18:46:34 -0800
committerColin Cross <ccross@android.com>2011-01-10 16:16:51 -0800
commit78d2a8274115727ab3864584abee09d3021de9c6 (patch)
tree0d4f5ed6fff1fff9568e3a5c65e9ab1168560727
parent5947e496b6dea68354785458a3bb07b5ca78ae85 (diff)
downloadqemu-78d2a8274115727ab3864584abee09d3021de9c6.tar.gz
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>
-rw-r--r--kernel/cgroup.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index 3f1552c7ee1..cc2a04ed3cc 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);
}