History

cgroup: Clean up css_set task traversal

css_task_iter stores pointer to head of each iterable list, this dates back to commit 0f0a2b4fa621 ("cgroup: reorganize css_task_iter") when we did not store cur_cset. Let us utilize list heads directly in cur_cset and streamline css_task_iter_advance_css_set a bit. This is no intentional function change.

Michal Koutný committed 6 years ago

Commit f43caa21 parent 9c974c72 files · +28 −36Browse files

Showing the changes to kernel/cgroup (1 of 2 files). Show all

Unified · Split

kernel/cgroup/cgroup.c+28−33
@@ -4391,29 +4391,24 @@ static void css_task_iter_advance_css_set(struct css_task_iter *it) · 4390 unmodified lines
43914391
43924392 lockdep_assert_held(&css_set_lock);
43934393
4394− /* Advance to the next non-empty css_set */
4395− do {
4396− cset = css_task_iter_next_css_set(it);
4397− if (!cset) {
4398− it->task_pos = NULL;
4399− return;
4394+ /* Advance to the next non-empty css_set and find first non-empty tasks list*/
4395+ while ((cset = css_task_iter_next_css_set(it))) {
4396+ if (!list_empty(&cset->tasks)) {
4397+ it->cur_tasks_head = &cset->tasks;
4398+ break;
4399+ } else if (!list_empty(&cset->mg_tasks)) {
4400+ it->cur_tasks_head = &cset->mg_tasks;
4401+ break;
4402+ } else if (!list_empty(&cset->dying_tasks)) {
4403+ it->cur_tasks_head = &cset->dying_tasks;
4404+ break;
44004405 }
4401− } while (!css_set_populated(cset) && list_empty(&cset->dying_tasks));
4402−
4403− if (!list_empty(&cset->tasks)) {
4404− it->task_pos = cset->tasks.next;
4405− it->cur_tasks_head = &cset->tasks;
4406− } else if (!list_empty(&cset->mg_tasks)) {
4407− it->task_pos = cset->mg_tasks.next;
4408− it->cur_tasks_head = &cset->mg_tasks;
4409− } else {
4410− it->task_pos = cset->dying_tasks.next;
4411− it->cur_tasks_head = &cset->dying_tasks;
44124406 }
4413−
4414− it->tasks_head = &cset->tasks;
4415− it->mg_tasks_head = &cset->mg_tasks;
4416− it->dying_tasks_head = &cset->dying_tasks;
4407+ if (!cset) {
4408+ it->task_pos = NULL;
4409+ return;
4410+ }
4411+ it->task_pos = it->cur_tasks_head->next;
44174412
44184413 /*
44194414 * We don't keep css_sets locked across iteration steps and thus
@@ -4458,24 +4453,24 @@ static void css_task_iter_advance(struct css_task_iter *it) · 38 unmodified lines
44584453 repeat:
44594454 if (it->task_pos) {
44604455 /*
4461− * Advance iterator to find next entry. cset->tasks is
4462− * consumed first and then ->mg_tasks. After ->mg_tasks,
4463− * we move onto the next cset.
4456+ * Advance iterator to find next entry. We go through cset
4457+ * tasks, mg_tasks and dying_tasks, when consumed we move onto
4458+ * the next cset.
44644459 */
44654460 if (it->flags & CSS_TASK_ITER_SKIPPED)
44664461 it->flags &= ~CSS_TASK_ITER_SKIPPED;
44674462 else
44684463 it->task_pos = it->task_pos->next;
44694464
4470− if (it->task_pos == it->tasks_head) {
4471− it->task_pos = it->mg_tasks_head->next;
4472− it->cur_tasks_head = it->mg_tasks_head;
4465+ if (it->task_pos == &it->cur_cset->tasks) {
4466+ it->cur_tasks_head = &it->cur_cset->mg_tasks;
4467+ it->task_pos = it->cur_tasks_head->next;
44734468 }
4474− if (it->task_pos == it->mg_tasks_head) {
4475− it->task_pos = it->dying_tasks_head->next;
4476− it->cur_tasks_head = it->dying_tasks_head;
4469+ if (it->task_pos == &it->cur_cset->mg_tasks) {
4470+ it->cur_tasks_head = &it->cur_cset->dying_tasks;
4471+ it->task_pos = it->cur_tasks_head->next;
44774472 }
4478− if (it->task_pos == it->dying_tasks_head)
4473+ if (it->task_pos == &it->cur_cset->dying_tasks)
44794474 css_task_iter_advance_css_set(it);
44804475 } else {
44814476 /* called from start, proceed to the first cset */
@@ -4493,12 +4488,12 @@ repeat: · 11 unmodified lines
44934488 goto repeat;
44944489
44954490 /* and dying leaders w/o live member threads */
4496− if (it->cur_tasks_head == it->dying_tasks_head &&
4491+ if (it->cur_tasks_head == &it->cur_cset->dying_tasks &&
44974492 !atomic_read(&task->signal->live))
44984493 goto repeat;
44994494 } else {
45004495 /* skip all dying ones */
4501− if (it->cur_tasks_head == it->dying_tasks_head)
4496+ if (it->cur_tasks_head == &it->cur_cset->dying_tasks)
45024497 goto repeat;
45034498 }
45044499 }