cgroup: remove cgroup_mutex from cgroupstats_build
authorShakeel Butt <shakeelb@google.com>
Mon, 25 Oct 2021 06:19:15 +0000 (23:19 -0700)
committerTejun Heo <tj@kernel.org>
Mon, 25 Oct 2021 17:24:03 +0000 (07:24 -1000)
The function cgroupstats_build extracts cgroup from the kernfs_node's
priv pointer which is a RCU pointer. So, there is no need to grab
cgroup_mutex. Just get the reference on the cgroup before using and
remove the cgroup_mutex altogether.

Signed-off-by: Shakeel Butt <shakeelb@google.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
kernel/cgroup/cgroup-v1.c

index f6cc5f8484dc171426314ba971c401d55468aebe..fd14a60379c1031ef601e8793b4dd78ee8259de9 100644 (file)
@@ -698,8 +698,6 @@ int cgroupstats_build(struct cgroupstats *stats, struct dentry *dentry)
            kernfs_type(kn) != KERNFS_DIR)
                return -EINVAL;
 
-       mutex_lock(&cgroup_mutex);
-
        /*
         * We aren't being called from kernfs and there's no guarantee on
         * @kn->priv's validity.  For this and css_tryget_online_from_dir(),
@@ -707,9 +705,8 @@ int cgroupstats_build(struct cgroupstats *stats, struct dentry *dentry)
         */
        rcu_read_lock();
        cgrp = rcu_dereference(*(void __rcu __force **)&kn->priv);
-       if (!cgrp || cgroup_is_dead(cgrp)) {
+       if (!cgrp || !cgroup_tryget(cgrp)) {
                rcu_read_unlock();
-               mutex_unlock(&cgroup_mutex);
                return -ENOENT;
        }
        rcu_read_unlock();
@@ -737,7 +734,7 @@ int cgroupstats_build(struct cgroupstats *stats, struct dentry *dentry)
        }
        css_task_iter_end(&it);
 
-       mutex_unlock(&cgroup_mutex);
+       cgroup_put(cgrp);
        return 0;
 }