summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/cgroup.h6
-rw-r--r--kernel/cgroup/cgroup-v1.c6
-rw-r--r--kernel/cgroup/cgroup.c24
-rw-r--r--kernel/cgroup/cpuset.c6
-rw-r--r--kernel/cgroup/freezer.c6
-rw-r--r--mm/memcontrol.c2
-rw-r--r--net/core/netclassid_cgroup.c2
7 files changed, 30 insertions, 22 deletions
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
index 308b10797a54..cae5831ae650 100644
--- a/include/linux/cgroup.h
+++ b/include/linux/cgroup.h
@@ -36,9 +36,13 @@
36#define CGROUP_WEIGHT_DFL 100 36#define CGROUP_WEIGHT_DFL 100
37#define CGROUP_WEIGHT_MAX 10000 37#define CGROUP_WEIGHT_MAX 10000
38 38
39/* walk only threadgroup leaders */
40#define CSS_TASK_ITER_PROCS (1U << 0)
41
39/* a css_task_iter should be treated as an opaque object */ 42/* a css_task_iter should be treated as an opaque object */
40struct css_task_iter { 43struct css_task_iter {
41 struct cgroup_subsys *ss; 44 struct cgroup_subsys *ss;
45 unsigned int flags;
42 46
43 struct list_head *cset_pos; 47 struct list_head *cset_pos;
44 struct list_head *cset_head; 48 struct list_head *cset_head;
@@ -129,7 +133,7 @@ struct task_struct *cgroup_taskset_first(struct cgroup_taskset *tset,
129struct task_struct *cgroup_taskset_next(struct cgroup_taskset *tset, 133struct task_struct *cgroup_taskset_next(struct cgroup_taskset *tset,
130 struct cgroup_subsys_state **dst_cssp); 134 struct cgroup_subsys_state **dst_cssp);
131 135
132void css_task_iter_start(struct cgroup_subsys_state *css, 136void css_task_iter_start(struct cgroup_subsys_state *css, unsigned int flags,
133 struct css_task_iter *it); 137 struct css_task_iter *it);
134struct task_struct *css_task_iter_next(struct css_task_iter *it); 138struct task_struct *css_task_iter_next(struct css_task_iter *it);
135void css_task_iter_end(struct css_task_iter *it); 139void css_task_iter_end(struct css_task_iter *it);
diff --git a/kernel/cgroup/cgroup-v1.c b/kernel/cgroup/cgroup-v1.c
index 60f72475863e..167aaab04bf9 100644
--- a/kernel/cgroup/cgroup-v1.c
+++ b/kernel/cgroup/cgroup-v1.c
@@ -121,7 +121,7 @@ int cgroup_transfer_tasks(struct cgroup *to, struct cgroup *from)
121 * ->can_attach() fails. 121 * ->can_attach() fails.
122 */ 122 */
123 do { 123 do {
124 css_task_iter_start(&from->self, &it); 124 css_task_iter_start(&from->self, 0, &it);
125 task = css_task_iter_next(&it); 125 task = css_task_iter_next(&it);
126 if (task) 126 if (task)
127 get_task_struct(task); 127 get_task_struct(task);
@@ -373,7 +373,7 @@ static int pidlist_array_load(struct cgroup *cgrp, enum cgroup_filetype type,
373 if (!array) 373 if (!array)
374 return -ENOMEM; 374 return -ENOMEM;
375 /* now, populate the array */ 375 /* now, populate the array */
376 css_task_iter_start(&cgrp->self, &it); 376 css_task_iter_start(&cgrp->self, 0, &it);
377 while ((tsk = css_task_iter_next(&it))) { 377 while ((tsk = css_task_iter_next(&it))) {
378 if (unlikely(n == length)) 378 if (unlikely(n == length))
379 break; 379 break;
@@ -749,7 +749,7 @@ int cgroupstats_build(struct cgroupstats *stats, struct dentry *dentry)
749 } 749 }
750 rcu_read_unlock(); 750 rcu_read_unlock();
751 751
752 css_task_iter_start(&cgrp->self, &it); 752 css_task_iter_start(&cgrp->self, 0, &it);
753 while ((tsk = css_task_iter_next(&it))) { 753 while ((tsk = css_task_iter_next(&it))) {
754 switch (tsk->state) { 754 switch (tsk->state) {
755 case TASK_RUNNING: 755 case TASK_RUNNING:
diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
index e3bda0752501..3c5a37a9a892 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -3643,6 +3643,7 @@ static void css_task_iter_advance(struct css_task_iter *it)
3643 lockdep_assert_held(&css_set_lock); 3643 lockdep_assert_held(&css_set_lock);
3644 WARN_ON_ONCE(!l); 3644 WARN_ON_ONCE(!l);
3645 3645
3646repeat:
3646 /* 3647 /*
3647 * Advance iterator to find next entry. cset->tasks is consumed 3648 * Advance iterator to find next entry. cset->tasks is consumed
3648 * first and then ->mg_tasks. After ->mg_tasks, we move onto the 3649 * first and then ->mg_tasks. After ->mg_tasks, we move onto the
@@ -3657,11 +3658,18 @@ static void css_task_iter_advance(struct css_task_iter *it)
3657 css_task_iter_advance_css_set(it); 3658 css_task_iter_advance_css_set(it);
3658 else 3659 else
3659 it->task_pos = l; 3660 it->task_pos = l;
3661
3662 /* if PROCS, skip over tasks which aren't group leaders */
3663 if ((it->flags & CSS_TASK_ITER_PROCS) && it->task_pos &&
3664 !thread_group_leader(list_entry(it->task_pos, struct task_struct,
3665 cg_list)))
3666 goto repeat;
3660} 3667}
3661 3668
3662/** 3669/**
3663 * css_task_iter_start - initiate task iteration 3670 * css_task_iter_start - initiate task iteration
3664 * @css: the css to walk tasks of 3671 * @css: the css to walk tasks of
3672 * @flags: CSS_TASK_ITER_* flags
3665 * @it: the task iterator to use 3673 * @it: the task iterator to use
3666 * 3674 *
3667 * Initiate iteration through the tasks of @css. The caller can call 3675 * Initiate iteration through the tasks of @css. The caller can call
@@ -3669,7 +3677,7 @@ static void css_task_iter_advance(struct css_task_iter *it)
3669 * returns NULL. On completion of iteration, css_task_iter_end() must be 3677 * returns NULL. On completion of iteration, css_task_iter_end() must be
3670 * called. 3678 * called.
3671 */ 3679 */
3672void css_task_iter_start(struct cgroup_subsys_state *css, 3680void css_task_iter_start(struct cgroup_subsys_state *css, unsigned int flags,
3673 struct css_task_iter *it) 3681 struct css_task_iter *it)
3674{ 3682{
3675 /* no one should try to iterate before mounting cgroups */ 3683 /* no one should try to iterate before mounting cgroups */
@@ -3680,6 +3688,7 @@ void css_task_iter_start(struct cgroup_subsys_state *css,
3680 spin_lock_irq(&css_set_lock); 3688 spin_lock_irq(&css_set_lock);
3681 3689
3682 it->ss = css->ss; 3690 it->ss = css->ss;
3691 it->flags = flags;
3683 3692
3684 if (it->ss) 3693 if (it->ss)
3685 it->cset_pos = &css->cgroup->e_csets[css->ss->id]; 3694 it->cset_pos = &css->cgroup->e_csets[css->ss->id];
@@ -3753,13 +3762,8 @@ static void *cgroup_procs_next(struct seq_file *s, void *v, loff_t *pos)
3753{ 3762{
3754 struct kernfs_open_file *of = s->private; 3763 struct kernfs_open_file *of = s->private;
3755 struct css_task_iter *it = of->priv; 3764 struct css_task_iter *it = of->priv;
3756 struct task_struct *task;
3757
3758 do {
3759 task = css_task_iter_next(it);
3760 } while (task && !thread_group_leader(task));
3761 3765
3762 return task; 3766 return css_task_iter_next(it);
3763} 3767}
3764 3768
3765static void *cgroup_procs_start(struct seq_file *s, loff_t *pos) 3769static void *cgroup_procs_start(struct seq_file *s, loff_t *pos)
@@ -3780,10 +3784,10 @@ static void *cgroup_procs_start(struct seq_file *s, loff_t *pos)
3780 if (!it) 3784 if (!it)
3781 return ERR_PTR(-ENOMEM); 3785 return ERR_PTR(-ENOMEM);
3782 of->priv = it; 3786 of->priv = it;
3783 css_task_iter_start(&cgrp->self, it); 3787 css_task_iter_start(&cgrp->self, CSS_TASK_ITER_PROCS, it);
3784 } else if (!(*pos)++) { 3788 } else if (!(*pos)++) {
3785 css_task_iter_end(it); 3789 css_task_iter_end(it);
3786 css_task_iter_start(&cgrp->self, it); 3790 css_task_iter_start(&cgrp->self, CSS_TASK_ITER_PROCS, it);
3787 } 3791 }
3788 3792
3789 return cgroup_procs_next(s, NULL, NULL); 3793 return cgroup_procs_next(s, NULL, NULL);
@@ -3791,7 +3795,7 @@ static void *cgroup_procs_start(struct seq_file *s, loff_t *pos)
3791 3795
3792static int cgroup_procs_show(struct seq_file *s, void *v) 3796static int cgroup_procs_show(struct seq_file *s, void *v)
3793{ 3797{
3794 seq_printf(s, "%d\n", task_tgid_vnr(v)); 3798 seq_printf(s, "%d\n", task_pid_vnr(v));
3795 return 0; 3799 return 0;
3796} 3800}
3797 3801
diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c
index ca8376e5008c..252d70c9a49b 100644
--- a/kernel/cgroup/cpuset.c
+++ b/kernel/cgroup/cpuset.c
@@ -861,7 +861,7 @@ static void update_tasks_cpumask(struct cpuset *cs)
861 struct css_task_iter it; 861 struct css_task_iter it;
862 struct task_struct *task; 862 struct task_struct *task;
863 863
864 css_task_iter_start(&cs->css, &it); 864 css_task_iter_start(&cs->css, 0, &it);
865 while ((task = css_task_iter_next(&it))) 865 while ((task = css_task_iter_next(&it)))
866 set_cpus_allowed_ptr(task, cs->effective_cpus); 866 set_cpus_allowed_ptr(task, cs->effective_cpus);
867 css_task_iter_end(&it); 867 css_task_iter_end(&it);
@@ -1091,7 +1091,7 @@ static void update_tasks_nodemask(struct cpuset *cs)
1091 * It's ok if we rebind the same mm twice; mpol_rebind_mm() 1091 * It's ok if we rebind the same mm twice; mpol_rebind_mm()
1092 * is idempotent. Also migrate pages in each mm to new nodes. 1092 * is idempotent. Also migrate pages in each mm to new nodes.
1093 */ 1093 */
1094 css_task_iter_start(&cs->css, &it); 1094 css_task_iter_start(&cs->css, 0, &it);
1095 while ((task = css_task_iter_next(&it))) { 1095 while ((task = css_task_iter_next(&it))) {
1096 struct mm_struct *mm; 1096 struct mm_struct *mm;
1097 bool migrate; 1097 bool migrate;
@@ -1284,7 +1284,7 @@ static void update_tasks_flags(struct cpuset *cs)
1284 struct css_task_iter it; 1284 struct css_task_iter it;
1285 struct task_struct *task; 1285 struct task_struct *task;
1286 1286
1287 css_task_iter_start(&cs->css, &it); 1287 css_task_iter_start(&cs->css, 0, &it);
1288 while ((task = css_task_iter_next(&it))) 1288 while ((task = css_task_iter_next(&it)))
1289 cpuset_update_task_spread_flag(cs, task); 1289 cpuset_update_task_spread_flag(cs, task);
1290 css_task_iter_end(&it); 1290 css_task_iter_end(&it);
diff --git a/kernel/cgroup/freezer.c b/kernel/cgroup/freezer.c
index 1b72d56edce5..08236798d173 100644
--- a/kernel/cgroup/freezer.c
+++ b/kernel/cgroup/freezer.c
@@ -268,7 +268,7 @@ static void update_if_frozen(struct cgroup_subsys_state *css)
268 rcu_read_unlock(); 268 rcu_read_unlock();
269 269
270 /* are all tasks frozen? */ 270 /* are all tasks frozen? */
271 css_task_iter_start(css, &it); 271 css_task_iter_start(css, 0, &it);
272 272
273 while ((task = css_task_iter_next(&it))) { 273 while ((task = css_task_iter_next(&it))) {
274 if (freezing(task)) { 274 if (freezing(task)) {
@@ -320,7 +320,7 @@ static void freeze_cgroup(struct freezer *freezer)
320 struct css_task_iter it; 320 struct css_task_iter it;
321 struct task_struct *task; 321 struct task_struct *task;
322 322
323 css_task_iter_start(&freezer->css, &it); 323 css_task_iter_start(&freezer->css, 0, &it);
324 while ((task = css_task_iter_next(&it))) 324 while ((task = css_task_iter_next(&it)))
325 freeze_task(task); 325 freeze_task(task);
326 css_task_iter_end(&it); 326 css_task_iter_end(&it);
@@ -331,7 +331,7 @@ static void unfreeze_cgroup(struct freezer *freezer)
331 struct css_task_iter it; 331 struct css_task_iter it;
332 struct task_struct *task; 332 struct task_struct *task;
333 333
334 css_task_iter_start(&freezer->css, &it); 334 css_task_iter_start(&freezer->css, 0, &it);
335 while ((task = css_task_iter_next(&it))) 335 while ((task = css_task_iter_next(&it)))
336 __thaw_task(task); 336 __thaw_task(task);
337 css_task_iter_end(&it); 337 css_task_iter_end(&it);
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 3df3c04d73ab..2b2f071f914b 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -917,7 +917,7 @@ int mem_cgroup_scan_tasks(struct mem_cgroup *memcg,
917 struct css_task_iter it; 917 struct css_task_iter it;
918 struct task_struct *task; 918 struct task_struct *task;
919 919
920 css_task_iter_start(&iter->css, &it); 920 css_task_iter_start(&iter->css, 0, &it);
921 while (!ret && (task = css_task_iter_next(&it))) 921 while (!ret && (task = css_task_iter_next(&it)))
922 ret = fn(task, arg); 922 ret = fn(task, arg);
923 css_task_iter_end(&it); 923 css_task_iter_end(&it);
diff --git a/net/core/netclassid_cgroup.c b/net/core/netclassid_cgroup.c
index 029a61ac6cdd..5e4f04004a49 100644
--- a/net/core/netclassid_cgroup.c
+++ b/net/core/netclassid_cgroup.c
@@ -100,7 +100,7 @@ static int write_classid(struct cgroup_subsys_state *css, struct cftype *cft,
100 100
101 cs->classid = (u32)value; 101 cs->classid = (u32)value;
102 102
103 css_task_iter_start(css, &it); 103 css_task_iter_start(css, 0, &it);
104 while ((p = css_task_iter_next(&it))) { 104 while ((p = css_task_iter_next(&it))) {
105 task_lock(p); 105 task_lock(p);
106 iterate_fd(p->files, 0, update_classid_sock, 106 iterate_fd(p->files, 0, update_classid_sock,