aboutsummaryrefslogtreecommitdiffstats
path: root/mm/memcontrol.c
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2014-02-11 11:52:47 -0500
committerTejun Heo <tj@kernel.org>2014-02-11 11:52:47 -0500
commit5a17f543ed6808e9085063277fe46795dea484bd (patch)
tree8b6e2afd5619bcff76438470670247eb55bef908 /mm/memcontrol.c
parent398f878789fceb51bf5e424b753a3756643513c4 (diff)
cgroup: improve css_from_dir() into css_tryget_from_dir()
css_from_dir() returns the matching css (cgroup_subsys_state) given a dentry and subsystem. The function doesn't pin the css before returning and requires the caller to be holding RCU read lock or cgroup_mutex and handling pinning on the caller side. Given that users of the function are likely to want to pin the returned css (both existing users do) and that getting and putting css's are very cheap, there's no reason for the interface to be tricky like this. Rename css_from_dir() to css_tryget_from_dir() and make it try to pin the found css and return it only if pinning succeeded. The callers are updated so that they no longer do RCU locking and pinning around the function and just use the returned css. This will also ease converting cgroup to kernfs. Signed-off-by: Tejun Heo <tj@kernel.org> Acked-by: Michal Hocko <mhocko@suse.cz> Acked-by: Li Zefan <lizefan@huawei.com> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Balbir Singh <bsingharora@gmail.com> Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Diffstat (limited to 'mm/memcontrol.c')
-rw-r--r--mm/memcontrol.c16
1 files changed, 7 insertions, 9 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 04a97bce2270..102ab48ffa13 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -6183,17 +6183,15 @@ static int memcg_write_event_control(struct cgroup_subsys_state *css,
6183 * automatically removed on cgroup destruction but the removal is 6183 * automatically removed on cgroup destruction but the removal is
6184 * asynchronous, so take an extra ref on @css. 6184 * asynchronous, so take an extra ref on @css.
6185 */ 6185 */
6186 rcu_read_lock(); 6186 cfile_css = css_tryget_from_dir(cfile.file->f_dentry->d_parent,
6187 6187 &memory_cgrp_subsys);
6188 ret = -EINVAL; 6188 ret = -EINVAL;
6189 cfile_css = css_from_dir(cfile.file->f_dentry->d_parent, 6189 if (IS_ERR(cfile_css))
6190 &memory_cgrp_subsys);
6191 if (cfile_css == css && css_tryget(css))
6192 ret = 0;
6193
6194 rcu_read_unlock();
6195 if (ret)
6196 goto out_put_cfile; 6190 goto out_put_cfile;
6191 if (cfile_css != css) {
6192 css_put(cfile_css);
6193 goto out_put_cfile;
6194 }
6197 6195
6198 ret = event->register_event(memcg, event->eventfd, buffer); 6196 ret = event->register_event(memcg, event->eventfd, buffer);
6199 if (ret) 6197 if (ret)