diff options
author | Hugh Dickins <hughd@google.com> | 2012-03-21 19:34:21 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-03-21 20:55:01 -0400 |
commit | ca464d69b19120a826aa2534de2511a6f542edf5 (patch) | |
tree | 092582419a30825b8483640856483ea8ee56cf81 | |
parent | 42aee6c495e07dba7410b863a360db6bb9ec6d66 (diff) |
memcg: let css_get_next() rely upon rcu_read_lock()
Remove lock and unlock around css_get_next()'s call to idr_get_next().
memcg iterators (only users of css_get_next) already did rcu_read_lock(),
and its comment demands that; but add a WARN_ON_ONCE to make sure of it.
Signed-off-by: Hugh Dickins <hughd@google.com>
Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Acked-by: Li Zefan <lizf@cn.fujitsu.com>
Cc: Eric Dumazet <eric.dumazet@gmail.com>
Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | kernel/cgroup.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/kernel/cgroup.c b/kernel/cgroup.c index 8eb90f25bd7b..391d5e991e5f 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c | |||
@@ -5033,6 +5033,8 @@ css_get_next(struct cgroup_subsys *ss, int id, | |||
5033 | return NULL; | 5033 | return NULL; |
5034 | 5034 | ||
5035 | BUG_ON(!ss->use_id); | 5035 | BUG_ON(!ss->use_id); |
5036 | WARN_ON_ONCE(!rcu_read_lock_held()); | ||
5037 | |||
5036 | /* fill start point for scan */ | 5038 | /* fill start point for scan */ |
5037 | tmpid = id; | 5039 | tmpid = id; |
5038 | while (1) { | 5040 | while (1) { |
@@ -5040,10 +5042,7 @@ css_get_next(struct cgroup_subsys *ss, int id, | |||
5040 | * scan next entry from bitmap(tree), tmpid is updated after | 5042 | * scan next entry from bitmap(tree), tmpid is updated after |
5041 | * idr_get_next(). | 5043 | * idr_get_next(). |
5042 | */ | 5044 | */ |
5043 | spin_lock(&ss->id_lock); | ||
5044 | tmp = idr_get_next(&ss->idr, &tmpid); | 5045 | tmp = idr_get_next(&ss->idr, &tmpid); |
5045 | spin_unlock(&ss->id_lock); | ||
5046 | |||
5047 | if (!tmp) | 5046 | if (!tmp) |
5048 | break; | 5047 | break; |
5049 | if (tmp->depth >= depth && tmp->stack[depth] == rootid) { | 5048 | if (tmp->depth >= depth && tmp->stack[depth] == rootid) { |