diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-10-22 03:20:34 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-10-22 03:20:34 -0400 |
commit | ee7eafc907db64ef4cbe8a17da3a1089cbe50617 (patch) | |
tree | 448cfbb1827083f875729135d4ab0d00b0f0752b /kernel | |
parent | 0df651a0740c9663093265277c32f0806e8ac23e (diff) | |
parent | ea84753c98a7ac6b74e530b64c444a912b3835ca (diff) |
Merge branch 'for-3.12-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup
Pull cgroup fixes from Tejun Heo:
"Two late fixes for cgroup.
One fixes descendant walk introduced during this rc1 cycle. The other
fixes a post 3.9 bug during task attach which can lead to hang. Both
fixes are critical and the fixes are relatively straight-forward"
* 'for-3.12-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup:
cgroup: fix to break the while loop in cgroup_attach_task() correctly
cgroup: fix cgroup post-order descendant walk of empty subtree
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/cgroup.c | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 2418b6e71a85..8bd9cfdc70d7 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
@@ -2039,7 +2039,7 @@ static int cgroup_attach_task(struct cgroup *cgrp, struct task_struct *tsk, | |||
2039 | 2039 | ||
2040 | /* @tsk either already exited or can't exit until the end */ | 2040 | /* @tsk either already exited or can't exit until the end */ |
2041 | if (tsk->flags & PF_EXITING) | 2041 | if (tsk->flags & PF_EXITING) |
2042 | continue; | 2042 | goto next; |
2043 | 2043 | ||
2044 | /* as per above, nr_threads may decrease, but not increase. */ | 2044 | /* as per above, nr_threads may decrease, but not increase. */ |
2045 | BUG_ON(i >= group_size); | 2045 | BUG_ON(i >= group_size); |
@@ -2047,7 +2047,7 @@ static int cgroup_attach_task(struct cgroup *cgrp, struct task_struct *tsk, | |||
2047 | ent.cgrp = task_cgroup_from_root(tsk, root); | 2047 | ent.cgrp = task_cgroup_from_root(tsk, root); |
2048 | /* nothing to do if this task is already in the cgroup */ | 2048 | /* nothing to do if this task is already in the cgroup */ |
2049 | if (ent.cgrp == cgrp) | 2049 | if (ent.cgrp == cgrp) |
2050 | continue; | 2050 | goto next; |
2051 | /* | 2051 | /* |
2052 | * saying GFP_ATOMIC has no effect here because we did prealloc | 2052 | * saying GFP_ATOMIC has no effect here because we did prealloc |
2053 | * earlier, but it's good form to communicate our expectations. | 2053 | * earlier, but it's good form to communicate our expectations. |
@@ -2055,7 +2055,7 @@ static int cgroup_attach_task(struct cgroup *cgrp, struct task_struct *tsk, | |||
2055 | retval = flex_array_put(group, i, &ent, GFP_ATOMIC); | 2055 | retval = flex_array_put(group, i, &ent, GFP_ATOMIC); |
2056 | BUG_ON(retval != 0); | 2056 | BUG_ON(retval != 0); |
2057 | i++; | 2057 | i++; |
2058 | 2058 | next: | |
2059 | if (!threadgroup) | 2059 | if (!threadgroup) |
2060 | break; | 2060 | break; |
2061 | } while_each_thread(leader, tsk); | 2061 | } while_each_thread(leader, tsk); |
@@ -3188,11 +3188,9 @@ css_next_descendant_post(struct cgroup_subsys_state *pos, | |||
3188 | 3188 | ||
3189 | WARN_ON_ONCE(!rcu_read_lock_held()); | 3189 | WARN_ON_ONCE(!rcu_read_lock_held()); |
3190 | 3190 | ||
3191 | /* if first iteration, visit the leftmost descendant */ | 3191 | /* if first iteration, visit leftmost descendant which may be @root */ |
3192 | if (!pos) { | 3192 | if (!pos) |
3193 | next = css_leftmost_descendant(root); | 3193 | return css_leftmost_descendant(root); |
3194 | return next != root ? next : NULL; | ||
3195 | } | ||
3196 | 3194 | ||
3197 | /* if we visited @root, we're done */ | 3195 | /* if we visited @root, we're done */ |
3198 | if (pos == root) | 3196 | if (pos == root) |