CSS_NO_REF      = (1 << 0), /* no reference counting for this css */
        CSS_ONLINE      = (1 << 1), /* between ->css_online() and ->css_offline() */
        CSS_RELEASED    = (1 << 2), /* refcnt reached zero, released */
+       CSS_VISIBLE     = (1 << 3), /* css is visible to userland */
 };
 
 /* bits in struct cgroup flags field */
 
        struct cgroup *cgrp = cgrp_override ?: css->cgroup;
        struct cftype *cfts;
 
+       if (!(css->flags & CSS_VISIBLE))
+               return;
+
+       css->flags &= ~CSS_VISIBLE;
+
        list_for_each_entry(cfts, &css->ss->cfts, node)
                cgroup_addrm_files(css, cgrp, cfts, false);
 }
        struct cftype *cfts, *failed_cfts;
        int ret;
 
+       if (css->flags & CSS_VISIBLE)
+               return 0;
+
        if (!css->ss) {
                if (cgroup_on_dfl(cgrp))
                        cfts = cgroup_dfl_base_files;
                        goto err;
                }
        }
+
+       css->flags |= CSS_VISIBLE;
+
        return 0;
 err:
        list_for_each_entry(cfts, &css->ss->cfts, node) {
        css_for_each_descendant_pre(css, cgroup_css(root, ss)) {
                struct cgroup *cgrp = css->cgroup;
 
-               if (cgroup_is_dead(cgrp))
+               if (!(css->flags & CSS_VISIBLE))
                        continue;
 
                ret = cgroup_addrm_files(css, cgrp, cfts, is_add);