2019-10-04 11:00:37

by Michal Koutný

[permalink] [raw]
Subject: [PATCH 0/5] Optimize single thread migration

Hello.

The important part is the patch 02 where the reasoning is.

The rest is mostly auxiliar and split out into separate commits for
better readability.

The patches are based on v5.3.

Michal


Michal Koutný (5):
cgroup: Update comments about task exit path
cgroup: Optimize single thread migration
selftests: cgroup: Simplify task self migration
selftests: cgroup: Add task migration tests
selftests: cgroup: Run test_core under interfering stress

kernel/cgroup/cgroup-internal.h | 5 +-
kernel/cgroup/cgroup-v1.c | 5 +-
kernel/cgroup/cgroup.c | 68 ++++----
tools/testing/selftests/cgroup/Makefile | 4 +-
tools/testing/selftests/cgroup/cgroup_util.c | 42 ++++-
tools/testing/selftests/cgroup/cgroup_util.h | 6 +-
tools/testing/selftests/cgroup/test_core.c | 146 ++++++++++++++++++
tools/testing/selftests/cgroup/test_freezer.c | 2 +-
tools/testing/selftests/cgroup/test_stress.sh | 4 +
tools/testing/selftests/cgroup/with_stress.sh | 101 ++++++++++++
10 files changed, 342 insertions(+), 41 deletions(-)
create mode 100755 tools/testing/selftests/cgroup/test_stress.sh
create mode 100755 tools/testing/selftests/cgroup/with_stress.sh

--
2.21.0


2019-10-04 11:02:04

by Michal Koutný

[permalink] [raw]
Subject: [PATCH 1/5] cgroup: Update comments about task exit path

We no longer take cgroup_mutex in cgroup_exit and the exiting tasks are
not moved to init_css_set, reflect that in several comments to prevent
confusion.

Signed-off-by: Michal Koutný <[email protected]>
---
kernel/cgroup/cgroup.c | 29 +++++++++--------------------
1 file changed, 9 insertions(+), 20 deletions(-)

diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
index 753afbca549f..1488bb732902 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -899,8 +899,7 @@ static void css_set_move_task(struct task_struct *task,
/*
* We are synchronized through cgroup_threadgroup_rwsem
* against PF_EXITING setting such that we can't race
- * against cgroup_exit() changing the css_set to
- * init_css_set and dropping the old one.
+ * against cgroup_exit()/cgroup_free() dropping the css_set.
*/
WARN_ON_ONCE(task->flags & PF_EXITING);

@@ -1430,9 +1429,8 @@ struct cgroup *task_cgroup_from_root(struct task_struct *task,
struct cgroup_root *root)
{
/*
- * No need to lock the task - since we hold cgroup_mutex the
- * task can't change groups, so the only thing that can happen
- * is that it exits and its css is set back to init_css_set.
+ * No need to lock the task - since we hold css_set_lock the
+ * task can't change groups.
*/
return cset_cgroup_from_root(task_css_set(task), root);
}
@@ -6020,7 +6018,7 @@ void cgroup_post_fork(struct task_struct *child)
struct css_set *cset;

spin_lock_irq(&css_set_lock);
- cset = task_css_set(current);
+ cset = task_css_set(current); /* current is @child's parent */
if (list_empty(&child->cg_list)) {
get_css_set(cset);
cset->nr_tasks++;
@@ -6063,20 +6061,8 @@ void cgroup_post_fork(struct task_struct *child)
* cgroup_exit - detach cgroup from exiting task
* @tsk: pointer to task_struct of exiting process
*
- * Description: Detach cgroup from @tsk and release it.
- *
- * Note that cgroups marked notify_on_release force every task in
- * them to take the global cgroup_mutex mutex when exiting.
- * This could impact scaling on very large systems. Be reluctant to
- * use notify_on_release cgroups where very high task exit scaling
- * is required on large systems.
+ * Description: Detach cgroup from @tsk.
*
- * We set the exiting tasks cgroup to the root cgroup (top_cgroup). We
- * call cgroup_exit() while the task is still competent to handle
- * notify_on_release(), then leave the task attached to the root cgroup in
- * each hierarchy for the remainder of its exit. No need to bother with
- * init_css_set refcnting. init_css_set never goes away and we can't race
- * with migration path - PF_EXITING is visible to migration path.
*/
void cgroup_exit(struct task_struct *tsk)
{
@@ -6086,7 +6072,8 @@ void cgroup_exit(struct task_struct *tsk)

/*
* Unlink from @tsk from its css_set. As migration path can't race
- * with us, we can check css_set and cg_list without synchronization.
+ * with us (thanks to cgroup_threadgroup_rwsem), we can check css_set
+ * and cg_list without synchronization.
*/
cset = task_css_set(tsk);

@@ -6102,6 +6089,8 @@ void cgroup_exit(struct task_struct *tsk)

spin_unlock_irq(&css_set_lock);
} else {
+ /* Take reference to avoid freeing init_css_set in cgroup_free,
+ * see cgroup_fork(). */
get_css_set(cset);
}

--
2.21.0

2019-10-07 14:15:49

by Tejun Heo

[permalink] [raw]
Subject: Re: [PATCH 0/5] Optimize single thread migration

On Fri, Oct 04, 2019 at 12:57:38PM +0200, Michal Koutn? wrote:
> Hello.
>
> The important part is the patch 02 where the reasoning is.
>
> The rest is mostly auxiliar and split out into separate commits for
> better readability.
>
> The patches are based on v5.3.

This is great. Applied to the series to cgroup/for-5.5

Thanks!

--
tejun