cgroup: reorganize css_task_iter functions
authorTejun Heo <tj@kernel.org>
Thu, 15 Oct 2015 20:41:52 +0000 (16:41 -0400)
committerTejun Heo <tj@kernel.org>
Thu, 15 Oct 2015 20:41:52 +0000 (16:41 -0400)
* Rename css_advance_task_iter() to css_task_iter_advance_css_set()
  and make it clear it->task_pos too at the end of the iteration.

* Factor out css_task_iter_advance() from css_task_iter_next().  The
  new function whines if called on a terminated iterator.

Except for the termination check, this is pure reorganization and
doesn't introduce any behavior changes.  This will help the planned
locking update for css_task_iter.

Signed-off-by: Tejun Heo <tj@kernel.org>
kernel/cgroup.c

index 0b6e50c67b65ce2f4efa148e3db08a4f0d6c3ef8..56e2b772b143ae411380f6afb21cf8a7f2b523e5 100644 (file)
@@ -3793,12 +3793,12 @@ bool css_has_online_children(struct cgroup_subsys_state *css)
 }
 
 /**
- * css_advance_task_iter - advance a task itererator to the next css_set
+ * css_task_iter_advance_css_set - advance a task itererator to the next css_set
  * @it: the iterator to advance
  *
  * Advance @it to the next css_set to walk.
  */
-static void css_advance_task_iter(struct css_task_iter *it)
+static void css_task_iter_advance_css_set(struct css_task_iter *it)
 {
        struct list_head *l = it->cset_pos;
        struct cgrp_cset_link *link;
@@ -3809,6 +3809,7 @@ static void css_advance_task_iter(struct css_task_iter *it)
                l = l->next;
                if (l == it->cset_head) {
                        it->cset_pos = NULL;
+                       it->task_pos = NULL;
                        return;
                }
 
@@ -3832,6 +3833,28 @@ static void css_advance_task_iter(struct css_task_iter *it)
        it->mg_tasks_head = &cset->mg_tasks;
 }
 
+static void css_task_iter_advance(struct css_task_iter *it)
+{
+       struct list_head *l = it->task_pos;
+
+       WARN_ON_ONCE(!l);
+
+       /*
+        * Advance iterator to find next entry.  cset->tasks is consumed
+        * first and then ->mg_tasks.  After ->mg_tasks, we move onto the
+        * next cset.
+        */
+       l = l->next;
+
+       if (l == it->tasks_head)
+               l = it->mg_tasks_head->next;
+
+       if (l == it->mg_tasks_head)
+               css_task_iter_advance_css_set(it);
+       else
+               it->task_pos = l;
+}
+
 /**
  * css_task_iter_start - initiate task iteration
  * @css: the css to walk tasks of
@@ -3864,7 +3887,7 @@ void css_task_iter_start(struct cgroup_subsys_state *css,
 
        it->cset_head = it->cset_pos;
 
-       css_advance_task_iter(it);
+       css_task_iter_advance_css_set(it);
 }
 
 /**
@@ -3878,28 +3901,12 @@ void css_task_iter_start(struct cgroup_subsys_state *css,
 struct task_struct *css_task_iter_next(struct css_task_iter *it)
 {
        struct task_struct *res;
-       struct list_head *l = it->task_pos;
 
-       /* If the iterator cg is NULL, we have no tasks */
        if (!it->cset_pos)
                return NULL;
-       res = list_entry(l, struct task_struct, cg_list);
-
-       /*
-        * Advance iterator to find next entry.  cset->tasks is consumed
-        * first and then ->mg_tasks.  After ->mg_tasks, we move onto the
-        * next cset.
-        */
-       l = l->next;
-
-       if (l == it->tasks_head)
-               l = it->mg_tasks_head->next;
-
-       if (l == it->mg_tasks_head)
-               css_advance_task_iter(it);
-       else
-               it->task_pos = l;
 
+       res = list_entry(it->task_pos, struct task_struct, cg_list);
+       css_task_iter_advance(it);
        return res;
 }