cgroup: make css_next_child() skip missing csses
authorTejun Heo <tj@kernel.org>
Wed, 23 Apr 2014 15:13:15 +0000 (11:13 -0400)
committerTejun Heo <tj@kernel.org>
Wed, 23 Apr 2014 15:13:15 +0000 (11:13 -0400)
css_next_child() walks the children of the specified css.  It does
this by finding the next cgroup and then returning the requested css.
On the default unified hierarchy, a cgroup may not have a css
associated with it even if the hierarchy has the subsystem enabled.
This patch updates css_next_child() so that it skips children without
the requested css associated.

Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Li Zefan <lizefan@huawei.com>
kernel/cgroup.c

index 37d966289978943f257a4eb86f8d0b31d264a292..0edc186cd545a03d8749036aafcfcd6874ca9cd6 100644 (file)
@@ -2708,10 +2708,19 @@ css_next_child(struct cgroup_subsys_state *pos_css,
                                break;
        }
 
-       if (&next->sibling == &cgrp->children)
-               return NULL;
+       /*
+        * @next, if not pointing to the head, can be dereferenced and is
+        * the next sibling; however, it might have @ss disabled.  If so,
+        * fast-forward to the next enabled one.
+        */
+       while (&next->sibling != &cgrp->children) {
+               struct cgroup_subsys_state *next_css = cgroup_css(next, parent_css->ss);
 
-       return cgroup_css(next, parent_css->ss);
+               if (next_css)
+                       return next_css;
+               next = list_entry_rcu(next->sibling.next, struct cgroup, sibling);
+       }
+       return NULL;
 }
 
 /**