diff options
author | Tejun Heo <tj@kernel.org> | 2018-12-27 18:05:30 -0800 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2018-12-27 18:05:30 -0800 |
commit | 4d71c6f8771a6bccb844244f09831fa4624b22c1 (patch) | |
tree | 9c6fdf753d64c839a4b0deb7d35d7e990c8e9971 /kernel/cgroup/cgroup.c | |
parent | 1e7eacaf1db2f0f5f62fceda4e6c5a8869f00c13 (diff) | |
parent | e9d81a1bc2c48ea9782e3e8b53875f419766ef47 (diff) |
Merge branch 'for-4.20-fixes' into for-4.21
Diffstat (limited to 'kernel/cgroup/cgroup.c')
-rw-r--r-- | kernel/cgroup/cgroup.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c index e06994fd4e34..8da9bf5e422f 100644 --- a/kernel/cgroup/cgroup.c +++ b/kernel/cgroup/cgroup.c @@ -4207,20 +4207,25 @@ static void css_task_iter_advance(struct css_task_iter *it) lockdep_assert_held(&css_set_lock); repeat: - /* - * Advance iterator to find next entry. cset->tasks is consumed - * first and then ->mg_tasks. After ->mg_tasks, we move onto the - * next cset. - */ - next = it->task_pos->next; + if (it->task_pos) { + /* + * Advance iterator to find next entry. cset->tasks is + * consumed first and then ->mg_tasks. After ->mg_tasks, + * we move onto the next cset. + */ + next = it->task_pos->next; - if (next == it->tasks_head) - next = it->mg_tasks_head->next; + if (next == it->tasks_head) + next = it->mg_tasks_head->next; - if (next == it->mg_tasks_head) + if (next == it->mg_tasks_head) + css_task_iter_advance_css_set(it); + else + it->task_pos = next; + } else { + /* called from start, proceed to the first cset */ css_task_iter_advance_css_set(it); - else - it->task_pos = next; + } /* if PROCS, skip over tasks which aren't group leaders */ if ((it->flags & CSS_TASK_ITER_PROCS) && it->task_pos && @@ -4260,7 +4265,7 @@ void css_task_iter_start(struct cgroup_subsys_state *css, unsigned int flags, it->cset_head = it->cset_pos; - css_task_iter_advance_css_set(it); + css_task_iter_advance(it); spin_unlock_irq(&css_set_lock); } |