bool early_init:1;
 
+       /*
+        * If %true, the controller, on the default hierarchy, doesn't show
+        * up in "cgroup.controllers" or "cgroup.subtree_control", is
+        * implicitly enabled on all cgroups on the default hierarchy, and
+        * bypasses the "no internal process" constraint.  This is for
+        * utility type controllers which is transparent to userland.
+        *
+        * An implicit controller can be stolen from the default hierarchy
+        * anytime and thus must be okay with offline csses from previous
+        * hierarchies coexisting with csses for the current one.
+        */
+       bool implicit_on_dfl:1;
+
        /*
         * If %false, this subsystem is properly hierarchical -
         * configuration, resource accounting and restriction on a parent
 
 /* some controllers are not supported in the default hierarchy */
 static u16 cgrp_dfl_inhibit_ss_mask;
 
+/* some controllers are implicitly enabled on the default hierarchy */
+static unsigned long cgrp_dfl_implicit_ss_mask;
+
 /* The list of hierarchy roots */
 
 static LIST_HEAD(cgroup_roots);
                return parent->subtree_control;
 
        if (cgroup_on_dfl(cgrp))
-               root_ss_mask &= ~cgrp_dfl_inhibit_ss_mask;
-
+               root_ss_mask &= ~(cgrp_dfl_inhibit_ss_mask |
+                                 cgrp_dfl_implicit_ss_mask);
        return root_ss_mask;
 }
 
 
        lockdep_assert_held(&cgroup_mutex);
 
+       cur_ss_mask |= cgrp_dfl_implicit_ss_mask;
+
        while (true) {
                u16 new_ss_mask = cur_ss_mask;
 
        lockdep_assert_held(&cgroup_mutex);
 
        do_each_subsys_mask(ss, ssid, ss_mask) {
-               /* if @ss has non-root csses attached to it, can't move */
-               if (css_next_child(NULL, cgroup_css(&ss->root->cgrp, ss)))
+               /*
+                * If @ss has non-root csses attached to it, can't move.
+                * If @ss is an implicit controller, it is exempt from this
+                * rule and can be stolen.
+                */
+               if (css_next_child(NULL, cgroup_css(&ss->root->cgrp, ss)) &&
+                   !ss->implicit_on_dfl)
                        return -EBUSY;
 
                /* can't move between two non-dummy roots either */
        }
 }
 
+static bool css_visible(struct cgroup_subsys_state *css)
+{
+       struct cgroup_subsys *ss = css->ss;
+       struct cgroup *cgrp = css->cgroup;
+
+       if (cgroup_control(cgrp) & (1 << ss->id))
+               return true;
+       if (!(cgroup_ss_mask(cgrp) & (1 << ss->id)))
+               return false;
+       return cgroup_on_dfl(cgrp) && ss->implicit_on_dfl;
+}
+
 /**
  * cgroup_apply_control_enable - enable or show csses according to control
  * @cgrp: root of the target subtree
                                        return PTR_ERR(css);
                        }
 
-                       if (cgroup_control(dsct) & (1 << ss->id)) {
+                       if (css_visible(css)) {
                                ret = css_populate_dir(css);
                                if (ret)
                                        return ret;
                        if (css->parent &&
                            !(cgroup_ss_mask(dsct) & (1 << ss->id))) {
                                kill_css(css);
-                       } else if (!(cgroup_control(dsct) & (1 << ss->id))) {
+                       } else if (!css_visible(css)) {
                                css_clear_dir(css);
                                if (ss->css_reset)
                                        ss->css_reset(css);
 
                cgrp_dfl_root.subsys_mask |= 1 << ss->id;
 
-               if (!ss->dfl_cftypes)
+               if (ss->implicit_on_dfl)
+                       cgrp_dfl_implicit_ss_mask |= 1 << ss->id;
+               else if (!ss->dfl_cftypes)
                        cgrp_dfl_inhibit_ss_mask |= 1 << ss->id;
 
                if (ss->dfl_cftypes == ss->legacy_cftypes) {