*/
        int level;
 
+       /*
+        * Keep track of total numbers of visible and dying descent cgroups.
+        * Dying cgroups are cgroups which were deleted by a user,
+        * but are still existing because someone else is holding a reference.
+        */
+       int nr_descendants;
+       int nr_dying_descendants;
+
        /*
         * Each non-empty css_set associated with this cgroup contributes
         * one to nr_populated_csets.  The counter is zero iff this cgroup
 
                if (ss->css_released)
                        ss->css_released(css);
        } else {
+               struct cgroup *tcgrp;
+
                /* cgroup release path */
                trace_cgroup_release(cgrp);
 
+               for (tcgrp = cgroup_parent(cgrp); tcgrp;
+                    tcgrp = cgroup_parent(tcgrp))
+                       tcgrp->nr_dying_descendants--;
+
                cgroup_idr_remove(&cgrp->root->cgroup_idr, cgrp->id);
                cgrp->id = -1;
 
        cgrp->root = root;
        cgrp->level = level;
 
-       for (tcgrp = cgrp; tcgrp; tcgrp = cgroup_parent(tcgrp))
+       for (tcgrp = cgrp; tcgrp; tcgrp = cgroup_parent(tcgrp)) {
                cgrp->ancestor_ids[tcgrp->level] = tcgrp->id;
 
+               if (tcgrp != cgrp)
+                       tcgrp->nr_descendants++;
+       }
+
        if (notify_on_release(parent))
                set_bit(CGRP_NOTIFY_ON_RELEASE, &cgrp->flags);
 
 static int cgroup_destroy_locked(struct cgroup *cgrp)
        __releases(&cgroup_mutex) __acquires(&cgroup_mutex)
 {
-       struct cgroup *parent = cgroup_parent(cgrp);
+       struct cgroup *tcgrp, *parent = cgroup_parent(cgrp);
        struct cgroup_subsys_state *css;
        struct cgrp_cset_link *link;
        int ssid;
        if (parent && cgroup_is_threaded(cgrp))
                parent->nr_threaded_children--;
 
+       for (tcgrp = cgroup_parent(cgrp); tcgrp; tcgrp = cgroup_parent(tcgrp)) {
+               tcgrp->nr_descendants--;
+               tcgrp->nr_dying_descendants++;
+       }
+
        cgroup1_check_for_release(cgroup_parent(cgrp));
 
        /* put the base reference */