Merge tag 'hwlock-v5.13' of git://git.kernel.org/pub/scm/linux/kernel/git/andersson...
[linux-2.6-microblaze.git] / kernel / cgroup / cgroup.c
index 9153b20..e049edd 100644 (file)
@@ -1339,6 +1339,7 @@ static void cgroup_destroy_root(struct cgroup_root *root)
 
        mutex_unlock(&cgroup_mutex);
 
+       cgroup_rstat_exit(cgrp);
        kernfs_destroy_root(root->kf_root);
        cgroup_free_root(root);
 }
@@ -1751,6 +1752,12 @@ int rebind_subsystems(struct cgroup_root *dst_root, u16 ss_mask)
                                       &dcgrp->e_csets[ss->id]);
                spin_unlock_irq(&css_set_lock);
 
+               if (ss->css_rstat_flush) {
+                       list_del_rcu(&css->rstat_css_node);
+                       list_add_rcu(&css->rstat_css_node,
+                                    &dcgrp->rstat_css_list);
+               }
+
                /* default hierarchy doesn't enable controllers by default */
                dst_root->subsys_mask |= 1 << ssid;
                if (dst_root == &cgrp_dfl_root) {
@@ -1971,10 +1978,14 @@ int cgroup_setup_root(struct cgroup_root *root, u16 ss_mask)
        if (ret)
                goto destroy_root;
 
-       ret = rebind_subsystems(root, ss_mask);
+       ret = cgroup_rstat_init(root_cgrp);
        if (ret)
                goto destroy_root;
 
+       ret = rebind_subsystems(root, ss_mask);
+       if (ret)
+               goto exit_stats;
+
        ret = cgroup_bpf_inherit(root_cgrp);
        WARN_ON_ONCE(ret);
 
@@ -2006,6 +2017,8 @@ int cgroup_setup_root(struct cgroup_root *root, u16 ss_mask)
        ret = 0;
        goto out;
 
+exit_stats:
+       cgroup_rstat_exit(root_cgrp);
 destroy_root:
        kernfs_destroy_root(root->kf_root);
        root->kf_root = NULL;
@@ -4934,8 +4947,7 @@ static void css_free_rwork_fn(struct work_struct *work)
                        cgroup_put(cgroup_parent(cgrp));
                        kernfs_put(cgrp->kn);
                        psi_cgroup_free(cgrp);
-                       if (cgroup_on_dfl(cgrp))
-                               cgroup_rstat_exit(cgrp);
+                       cgroup_rstat_exit(cgrp);
                        kfree(cgrp);
                } else {
                        /*
@@ -4976,8 +4988,7 @@ static void css_release_work_fn(struct work_struct *work)
                /* cgroup release path */
                TRACE_CGROUP_PATH(release, cgrp);
 
-               if (cgroup_on_dfl(cgrp))
-                       cgroup_rstat_flush(cgrp);
+               cgroup_rstat_flush(cgrp);
 
                spin_lock_irq(&css_set_lock);
                for (tcgrp = cgroup_parent(cgrp); tcgrp;
@@ -5034,7 +5045,7 @@ static void init_and_link_css(struct cgroup_subsys_state *css,
                css_get(css->parent);
        }
 
-       if (cgroup_on_dfl(cgrp) && ss->css_rstat_flush)
+       if (ss->css_rstat_flush)
                list_add_rcu(&css->rstat_css_node, &cgrp->rstat_css_list);
 
        BUG_ON(cgroup_css(cgrp, ss));
@@ -5159,11 +5170,9 @@ static struct cgroup *cgroup_create(struct cgroup *parent, const char *name,
        if (ret)
                goto out_free_cgrp;
 
-       if (cgroup_on_dfl(parent)) {
-               ret = cgroup_rstat_init(cgrp);
-               if (ret)
-                       goto out_cancel_ref;
-       }
+       ret = cgroup_rstat_init(cgrp);
+       if (ret)
+               goto out_cancel_ref;
 
        /* create the directory */
        kn = kernfs_create_dir(parent->kn, name, mode, cgrp);
@@ -5250,8 +5259,7 @@ out_psi_free:
 out_kernfs_remove:
        kernfs_remove(cgrp->kn);
 out_stat_exit:
-       if (cgroup_on_dfl(parent))
-               cgroup_rstat_exit(cgrp);
+       cgroup_rstat_exit(cgrp);
 out_cancel_ref:
        percpu_ref_exit(&cgrp->self.refcnt);
 out_free_cgrp: