diff options
-rw-r--r-- | include/linux/cgroup.h | 6 | ||||
-rw-r--r-- | kernel/cgroup/cgroup-v1.c | 6 | ||||
-rw-r--r-- | kernel/cgroup/cgroup.c | 24 | ||||
-rw-r--r-- | kernel/cgroup/cpuset.c | 6 | ||||
-rw-r--r-- | kernel/cgroup/freezer.c | 6 | ||||
-rw-r--r-- | mm/memcontrol.c | 2 | ||||
-rw-r--r-- | net/core/netclassid_cgroup.c | 2 |
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 */ |
40 | struct css_task_iter { | 43 | struct 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, | |||
129 | struct task_struct *cgroup_taskset_next(struct cgroup_taskset *tset, | 133 | struct 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 | ||
132 | void css_task_iter_start(struct cgroup_subsys_state *css, | 136 | void css_task_iter_start(struct cgroup_subsys_state *css, unsigned int flags, |
133 | struct css_task_iter *it); | 137 | struct css_task_iter *it); |
134 | struct task_struct *css_task_iter_next(struct css_task_iter *it); | 138 | struct task_struct *css_task_iter_next(struct css_task_iter *it); |
135 | void css_task_iter_end(struct css_task_iter *it); | 139 | void 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 | ||
3646 | repeat: | ||
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 | */ |
3672 | void css_task_iter_start(struct cgroup_subsys_state *css, | 3680 | void 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 | ||
3765 | static void *cgroup_procs_start(struct seq_file *s, loff_t *pos) | 3769 | static 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 | ||
3792 | static int cgroup_procs_show(struct seq_file *s, void *v) | 3796 | static 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, |