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

Unified · Split

2 files
  1. include/linux/cgroup.h +0 −3
  2. kernel/cgroup/cgroup.c +28 −33
include/linux/cgroup.h+0−3
@@ -58,9 +58,6 @@ struct css_task_iter { · 57 unmodified lines
58 struct list_head *tcset_head;58 struct list_head *tcset_head;
59 59
60 struct list_head *task_pos;60 struct list_head *task_pos;
61 struct list_head *tasks_head;
62 struct list_head *mg_tasks_head;
63 struct list_head *dying_tasks_head;
64 61
65 struct list_head *cur_tasks_head;62 struct list_head *cur_tasks_head;
66 struct css_set *cur_cset;63 struct css_set *cur_cset;
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
4391 4391
4392 lockdep_assert_held(&css_set_lock);4392 lockdep_assert_held(&css_set_lock);
4393 4393
4394 /* Advance to the next non-empty css_set */4394 /* Advance to the next non-empty css_set and find first non-empty tasks list*/
4395 do {4395 while ((cset = css_task_iter_next_css_set(it))) {
4396 cset = css_task_iter_next_css_set(it);4396 if (!list_empty(&cset->tasks)) {
4397 if (!cset) {4397 it->cur_tasks_head = &cset->tasks;
4398 it->task_pos = NULL;4398 break;
4399 return;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;
4400 }4405 }
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;
4412 }4406 }
4413 4407 if (!cset) {
4414 it->tasks_head = &cset->tasks;4408 it->task_pos = NULL;
4415 it->mg_tasks_head = &cset->mg_tasks;4409 return;
4416 it->dying_tasks_head = &cset->dying_tasks;4410 }
4411 it->task_pos = it->cur_tasks_head->next;
4417 4412
4418 /*4413 /*
4419 * We don't keep css_sets locked across iteration steps and thus4414 * 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
4458repeat:4453repeat:
4459 if (it->task_pos) {4454 if (it->task_pos) {
4460 /*4455 /*
4461 * Advance iterator to find next entry. cset->tasks is4456 * Advance iterator to find next entry. We go through cset
4462 * consumed first and then ->mg_tasks. After ->mg_tasks,4457 * tasks, mg_tasks and dying_tasks, when consumed we move onto
4463 * we move onto the next cset.4458 * the next cset.
4464 */4459 */
4465 if (it->flags & CSS_TASK_ITER_SKIPPED)4460 if (it->flags & CSS_TASK_ITER_SKIPPED)
4466 it->flags &= ~CSS_TASK_ITER_SKIPPED;4461 it->flags &= ~CSS_TASK_ITER_SKIPPED;
4467 else4462 else
4468 it->task_pos = it->task_pos->next;4463 it->task_pos = it->task_pos->next;
4469 4464
4470 if (it->task_pos == it->tasks_head) {4465 if (it->task_pos == &it->cur_cset->tasks) {
4471 it->task_pos = it->mg_tasks_head->next;4466 it->cur_tasks_head = &it->cur_cset->mg_tasks;
4472 it->cur_tasks_head = it->mg_tasks_head;4467 it->task_pos = it->cur_tasks_head->next;
4473 }4468 }
4474 if (it->task_pos == it->mg_tasks_head) {4469 if (it->task_pos == &it->cur_cset->mg_tasks) {
4475 it->task_pos = it->dying_tasks_head->next;4470 it->cur_tasks_head = &it->cur_cset->dying_tasks;
4476 it->cur_tasks_head = it->dying_tasks_head;4471 it->task_pos = it->cur_tasks_head->next;
4477 }4472 }
4478 if (it->task_pos == it->dying_tasks_head)4473 if (it->task_pos == &it->cur_cset->dying_tasks)
4479 css_task_iter_advance_css_set(it);4474 css_task_iter_advance_css_set(it);
4480 } else {4475 } else {
4481 /* called from start, proceed to the first cset */4476 /* called from start, proceed to the first cset */
@@ -4493,12 +4488,12 @@ repeat: · 11 unmodified lines
4493 goto repeat;4488 goto repeat;
4494 4489
4495 /* and dying leaders w/o live member threads */4490 /* 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 &&
4497 !atomic_read(&task->signal->live))4492 !atomic_read(&task->signal->live))
4498 goto repeat;4493 goto repeat;
4499 } else {4494 } else {
4500 /* skip all dying ones */4495 /* 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)
4502 goto repeat;4497 goto repeat;
4503 }4498 }
4504}4499}