cgroup: make cgroup_task_iter remember the cgroup being iterated
authorTejun Heo <tj@kernel.org>
Fri, 9 Aug 2013 00:11:26 +0000 (20:11 -0400)
committerTejun Heo <tj@kernel.org>
Fri, 9 Aug 2013 00:11:26 +0000 (20:11 -0400)
Currently all cgroup_task_iter functions require @cgrp to be passed
in, which is superflous and increases chance of usage error.  Make
cgroup_task_iter remember the cgroup being iterated and drop @cgrp
argument from next and end functions.

This patch doesn't introduce any behavior differences.

Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Li Zefan <lizefan@huawei.com>
Acked-by: Michal Hocko <mhocko@suse.cz>
Cc: Matt Helsley <matthltc@us.ibm.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Balbir Singh <bsingharora@gmail.com>
include/linux/cgroup.h
kernel/cgroup.c
kernel/cgroup_freezer.c
mm/memcontrol.c

index ea439794bd9bc69fd3335c504815a397221a0dfa..0287fccd0f5442ae4f48b0f9c9a3f84bba2ead85 100644 (file)
@@ -891,14 +891,14 @@ css_next_descendant_post(struct cgroup_subsys_state *pos,
 
 /* A cgroup_task_iter should be treated as an opaque object */
 struct cgroup_task_iter {
+       struct cgroup                   *origin_cgrp;
        struct list_head                *cset_link;
        struct list_head                *task;
 };
 
 void cgroup_task_iter_start(struct cgroup *cgrp, struct cgroup_task_iter *it);
-struct task_struct *cgroup_task_iter_next(struct cgroup *cgrp,
-                                         struct cgroup_task_iter *it);
-void cgroup_task_iter_end(struct cgroup *cgrp, struct cgroup_task_iter *it);
+struct task_struct *cgroup_task_iter_next(struct cgroup_task_iter *it);
+void cgroup_task_iter_end(struct cgroup_task_iter *it);
 int cgroup_scan_tasks(struct cgroup_scanner *scan);
 int cgroup_attach_task_all(struct task_struct *from, struct task_struct *);
 int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from);
index 15c93f9c9e57c1c57ba82eeb11be1e941ff0e70a..abc62ea1303c3f73ee89a19a81994768d668a774 100644 (file)
@@ -3205,13 +3205,11 @@ EXPORT_SYMBOL_GPL(css_next_descendant_post);
 
 /**
  * cgroup_advance_task_iter - advance a task itererator to the next css_set
- * @cgrp: the cgroup to walk tasks of
  * @it: the iterator to advance
  *
  * Advance @it to the next css_set to walk.
  */
-static void cgroup_advance_task_iter(struct cgroup *cgrp,
-                                    struct cgroup_task_iter *it)
+static void cgroup_advance_task_iter(struct cgroup_task_iter *it)
 {
        struct list_head *l = it->cset_link;
        struct cgrp_cset_link *link;
@@ -3220,7 +3218,7 @@ static void cgroup_advance_task_iter(struct cgroup *cgrp,
        /* Advance to the next non-empty css_set */
        do {
                l = l->next;
-               if (l == &cgrp->cset_links) {
+               if (l == &it->origin_cgrp->cset_links) {
                        it->cset_link = NULL;
                        return;
                }
@@ -3257,21 +3255,22 @@ void cgroup_task_iter_start(struct cgroup *cgrp, struct cgroup_task_iter *it)
                cgroup_enable_task_cg_lists();
 
        read_lock(&css_set_lock);
+
+       it->origin_cgrp = cgrp;
        it->cset_link = &cgrp->cset_links;
-       cgroup_advance_task_iter(cgrp, it);
+
+       cgroup_advance_task_iter(it);
 }
 
 /**
  * cgroup_task_iter_next - return the next task for the iterator
- * @cgrp: the cgroup to walk tasks of
  * @it: the task iterator being iterated
  *
  * The "next" function for task iteration.  @it should have been
  * initialized via cgroup_task_iter_start().  Returns NULL when the
  * iteration reaches the end.
  */
-struct task_struct *cgroup_task_iter_next(struct cgroup *cgrp,
-                                         struct cgroup_task_iter *it)
+struct task_struct *cgroup_task_iter_next(struct cgroup_task_iter *it)
 {
        struct task_struct *res;
        struct list_head *l = it->task;
@@ -3289,7 +3288,7 @@ struct task_struct *cgroup_task_iter_next(struct cgroup *cgrp,
                 * We reached the end of this task list - move on to the
                 * next cgrp_cset_link.
                 */
-               cgroup_advance_task_iter(cgrp, it);
+               cgroup_advance_task_iter(it);
        } else {
                it->task = l;
        }
@@ -3298,12 +3297,11 @@ struct task_struct *cgroup_task_iter_next(struct cgroup *cgrp,
 
 /**
  * cgroup_task_iter_end - finish task iteration
- * @cgrp: the cgroup to walk tasks of
  * @it: the task iterator to finish
  *
  * Finish task iteration started by cgroup_task_iter_start().
  */
-void cgroup_task_iter_end(struct cgroup *cgrp, struct cgroup_task_iter *it)
+void cgroup_task_iter_end(struct cgroup_task_iter *it)
        __releases(css_set_lock)
 {
        read_unlock(&css_set_lock);
@@ -3409,7 +3407,7 @@ int cgroup_scan_tasks(struct cgroup_scanner *scan)
         */
        heap->size = 0;
        cgroup_task_iter_start(scan->cgrp, &it);
-       while ((p = cgroup_task_iter_next(scan->cgrp, &it))) {
+       while ((p = cgroup_task_iter_next(&it))) {
                /*
                 * Only affect tasks that qualify per the caller's callback,
                 * if he provided one
@@ -3442,7 +3440,7 @@ int cgroup_scan_tasks(struct cgroup_scanner *scan)
                 * the heap and wasn't inserted
                 */
        }
-       cgroup_task_iter_end(scan->cgrp, &it);
+       cgroup_task_iter_end(&it);
 
        if (heap->size) {
                for (i = 0; i < heap->size; i++) {
@@ -3664,7 +3662,7 @@ static int pidlist_array_load(struct cgroup *cgrp, enum cgroup_filetype type,
                return -ENOMEM;
        /* now, populate the array */
        cgroup_task_iter_start(cgrp, &it);
-       while ((tsk = cgroup_task_iter_next(cgrp, &it))) {
+       while ((tsk = cgroup_task_iter_next(&it))) {
                if (unlikely(n == length))
                        break;
                /* get tgid or pid for procs or tasks file respectively */
@@ -3675,7 +3673,7 @@ static int pidlist_array_load(struct cgroup *cgrp, enum cgroup_filetype type,
                if (pid > 0) /* make sure to only use valid results */
                        array[n++] = pid;
        }
-       cgroup_task_iter_end(cgrp, &it);
+       cgroup_task_iter_end(&it);
        length = n;
        /* now sort & (if procs) strip out duplicates */
        sort(array, length, sizeof(pid_t), cmppid, NULL);
@@ -3724,7 +3722,7 @@ int cgroupstats_build(struct cgroupstats *stats, struct dentry *dentry)
        cgrp = dentry->d_fsdata;
 
        cgroup_task_iter_start(cgrp, &it);
-       while ((tsk = cgroup_task_iter_next(cgrp, &it))) {
+       while ((tsk = cgroup_task_iter_next(&it))) {
                switch (tsk->state) {
                case TASK_RUNNING:
                        stats->nr_running++;
@@ -3744,7 +3742,7 @@ int cgroupstats_build(struct cgroupstats *stats, struct dentry *dentry)
                        break;
                }
        }
-       cgroup_task_iter_end(cgrp, &it);
+       cgroup_task_iter_end(&it);
 
 err:
        return ret;
index c9177f8fc6614f04c8a9915fee70fafa2c870a2c..e0ab9bfd679a9d7454e334f5ccaf0bdc8667fa27 100644 (file)
@@ -281,7 +281,7 @@ static void update_if_frozen(struct cgroup_subsys_state *css)
        /* are all tasks frozen? */
        cgroup_task_iter_start(css->cgroup, &it);
 
-       while ((task = cgroup_task_iter_next(css->cgroup, &it))) {
+       while ((task = cgroup_task_iter_next(&it))) {
                if (freezing(task)) {
                        /*
                         * freezer_should_skip() indicates that the task
@@ -296,7 +296,7 @@ static void update_if_frozen(struct cgroup_subsys_state *css)
 
        freezer->state |= CGROUP_FROZEN;
 out_iter_end:
-       cgroup_task_iter_end(css->cgroup, &it);
+       cgroup_task_iter_end(&it);
 out_unlock:
        spin_unlock_irq(&freezer->lock);
 }
@@ -327,9 +327,9 @@ static void freeze_cgroup(struct freezer *freezer)
        struct task_struct *task;
 
        cgroup_task_iter_start(cgroup, &it);
-       while ((task = cgroup_task_iter_next(cgroup, &it)))
+       while ((task = cgroup_task_iter_next(&it)))
                freeze_task(task);
-       cgroup_task_iter_end(cgroup, &it);
+       cgroup_task_iter_end(&it);
 }
 
 static void unfreeze_cgroup(struct freezer *freezer)
@@ -339,9 +339,9 @@ static void unfreeze_cgroup(struct freezer *freezer)
        struct task_struct *task;
 
        cgroup_task_iter_start(cgroup, &it);
-       while ((task = cgroup_task_iter_next(cgroup, &it)))
+       while ((task = cgroup_task_iter_next(&it)))
                __thaw_task(task);
-       cgroup_task_iter_end(cgroup, &it);
+       cgroup_task_iter_end(&it);
 }
 
 /**
index 00b055dd1d3d87705815e9be92cc3d0e24f682dc..5a5f4dc649f07b2cb081b9c0a2be472b477bff92 100644 (file)
@@ -1804,7 +1804,7 @@ static void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask,
                struct task_struct *task;
 
                cgroup_task_iter_start(cgroup, &it);
-               while ((task = cgroup_task_iter_next(cgroup, &it))) {
+               while ((task = cgroup_task_iter_next(&it))) {
                        switch (oom_scan_process_thread(task, totalpages, NULL,
                                                        false)) {
                        case OOM_SCAN_SELECT:
@@ -1817,7 +1817,7 @@ static void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask,
                        case OOM_SCAN_CONTINUE:
                                continue;
                        case OOM_SCAN_ABORT:
-                               cgroup_task_iter_end(cgroup, &it);
+                               cgroup_task_iter_end(&it);
                                mem_cgroup_iter_break(memcg, iter);
                                if (chosen)
                                        put_task_struct(chosen);
@@ -1834,7 +1834,7 @@ static void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask,
                                get_task_struct(chosen);
                        }
                }
-               cgroup_task_iter_end(cgroup, &it);
+               cgroup_task_iter_end(&it);
        }
 
        if (!chosen)