diff options
author | Johannes Weiner <hannes@cmpxchg.org> | 2012-05-29 18:06:24 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-29 19:22:20 -0400 |
commit | 91c63734f6908425903aed69c04035592f18d398 (patch) | |
tree | 6790827ab915b17c63d5c39d8c72c47f3764f868 /mm/memcontrol.c | |
parent | 0ce72d4f7333248efbef1f3309770c7edb1b2625 (diff) |
kernel: cgroup: push rcu read locking from css_is_ancestor() to callsite
Library functions should not grab locks when the callsites can do it,
even if the lock nests like the rcu read-side lock does.
Push the rcu_read_lock() from css_is_ancestor() to its single user,
mem_cgroup_same_or_subtree() in preparation for another user that may
already hold the rcu read-side lock.
Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>
Cc: Konstantin Khlebnikov <khlebnikov@openvz.org>
Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Acked-by: Michal Hocko <mhocko@suse.cz>
Acked-by: Li Zefan <lizf@cn.fujitsu.com>
Cc: Li Zefan <lizf@cn.fujitsu.com>
Cc: Tejun Heo <tj@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/memcontrol.c')
-rw-r--r-- | mm/memcontrol.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 92675fe8a2ef..faad98e6d17d 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -1152,12 +1152,16 @@ struct lruvec *mem_cgroup_lru_move_lists(struct zone *zone, | |||
1152 | static bool mem_cgroup_same_or_subtree(const struct mem_cgroup *root_memcg, | 1152 | static bool mem_cgroup_same_or_subtree(const struct mem_cgroup *root_memcg, |
1153 | struct mem_cgroup *memcg) | 1153 | struct mem_cgroup *memcg) |
1154 | { | 1154 | { |
1155 | if (root_memcg != memcg) { | 1155 | bool ret; |
1156 | return (root_memcg->use_hierarchy && | ||
1157 | css_is_ancestor(&memcg->css, &root_memcg->css)); | ||
1158 | } | ||
1159 | 1156 | ||
1160 | return true; | 1157 | if (root_memcg == memcg) |
1158 | return true; | ||
1159 | if (!root_memcg->use_hierarchy) | ||
1160 | return false; | ||
1161 | rcu_read_lock(); | ||
1162 | ret = css_is_ancestor(&memcg->css, &root_memcg->css); | ||
1163 | rcu_read_unlock(); | ||
1164 | return ret; | ||
1161 | } | 1165 | } |
1162 | 1166 | ||
1163 | int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *memcg) | 1167 | int task_in_mem_cgroup(struct task_struct *task, const struct mem_cgroup *memcg) |