* [PATCH v2 0/2] cgroup/cpuset: Miscellaneous fixes and cleanups
@ 2026-06-23 23:04 Waiman Long
2026-06-23 23:04 ` [PATCH v2 1/2] cgroup/cpuset: Avoid unnecessary cpus & mems update in cpuset_hotplug_update_tasks() Waiman Long
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Waiman Long @ 2026-06-23 23:04 UTC (permalink / raw)
To: Tejun Heo, Johannes Weiner, Michal Koutný, Ridong Chen,
Jonathan Corbet, Shuah Khan
Cc: cgroups, linux-kernel, linux-doc, linux-kselftest, Waiman Long
v2:
- Update patch 1 as suggested by Ridong Chen and add new test cases.
- Minor update to patch 2 code and comment log.
Patch 1 updates compute_effective_cpumask() and adds new
compute_effective_nodemask() helper to make sure that effective_cpus
and effective_mems will inherit parent's versions for v2 if
cpuset.cpus/cpuset.mems is empty.
Patch 2 makes cpuset_update_tasks_nodemask() to perform memory rebind
and migration only for thread group leader like cpuset_attach().
Waiman Long (2):
cgroup/cpuset: Avoid unnecessary cpus & mems update in
cpuset_hotplug_update_tasks()
cgroup/cpuset: Rebind/migrate mm only for threadgroup leader in
cpuset_update_tasks_nodemask()
Documentation/admin-guide/cgroup-v2.rst | 7 +++
kernel/cgroup/cpuset.c | 49 ++++++++++++-------
.../selftests/cgroup/test_cpuset_prs.sh | 11 ++++-
3 files changed, 46 insertions(+), 21 deletions(-)
--
2.54.0
^ permalink raw reply [flat|nested] 7+ messages in thread* [PATCH v2 1/2] cgroup/cpuset: Avoid unnecessary cpus & mems update in cpuset_hotplug_update_tasks() 2026-06-23 23:04 [PATCH v2 0/2] cgroup/cpuset: Miscellaneous fixes and cleanups Waiman Long @ 2026-06-23 23:04 ` Waiman Long 2026-06-24 5:51 ` Ridong Chen 2026-06-24 8:40 ` Manuel Ebner 2026-06-23 23:04 ` [PATCH v2 2/2] cgroup/cpuset: Rebind/migrate mm only for threadgroup leader in cpuset_update_tasks_nodemask() Waiman Long 2026-06-24 19:47 ` [PATCH v2 0/2] cgroup/cpuset: Miscellaneous fixes and cleanups Tejun Heo 2 siblings, 2 replies; 7+ messages in thread From: Waiman Long @ 2026-06-23 23:04 UTC (permalink / raw) To: Tejun Heo, Johannes Weiner, Michal Koutný, Ridong Chen, Jonathan Corbet, Shuah Khan Cc: cgroups, linux-kernel, linux-doc, linux-kselftest, Waiman Long As reported by sashiko [1], cpuset_hotplug_update_tasks() may perform unnecessary task iteration and updating of tasks' CPU and node masks when mems_allowed and/or cpus_allowed are not set in cpuset v2. It is due to the fact that the temporary new_cpus and new_mems masks do not inherit parent's effective_cpus/mems when they are empty which is the expected behavior for cpuset v2 since commit 4ec22e9c5a90 ("cpuset: Enable cpuset controller in default hierarchy"). Fix that and avoid unnecessay work by enhancing compute_effective_cpumask() to add the empty cpumask check and inheriting the parent's versions if empty when in v2. A new compute_effective_nodemask() helper is also added to perform similar function for new effective_mems. Add new test_cpuset_prs.sh test cases to confirm that effective_cpus will inherit the parent's version if cpuset.cpus is empty. [1] https://sashiko.dev/#/patchset/20260621032816.1806773-1-longman%40redhat.com Suggested-by: Ridong Chen <ridong.chen@linux.dev> Fixes: 4ec22e9c5a90 ("cpuset: Enable cpuset controller in default hierarchy") Signed-off-by: Waiman Long <longman@redhat.com> --- kernel/cgroup/cpuset.c | 45 +++++++++++-------- .../selftests/cgroup/test_cpuset_prs.sh | 11 ++++- 2 files changed, 35 insertions(+), 21 deletions(-) diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c index aff86acea701..044ddbf66f8e 100644 --- a/kernel/cgroup/cpuset.c +++ b/kernel/cgroup/cpuset.c @@ -1094,12 +1094,35 @@ void cpuset_update_tasks_cpumask(struct cpuset *cs, struct cpumask *new_cpus) * @cs: the cpuset the need to recompute the new effective_cpus mask * @parent: the parent cpuset * + * For v2, the parent's effective_cpus is inherited if cpumask empty. * The result is valid only if the given cpuset isn't a partition root. */ static void compute_effective_cpumask(struct cpumask *new_cpus, struct cpuset *cs, struct cpuset *parent) { - cpumask_and(new_cpus, cs->cpus_allowed, parent->effective_cpus); + bool has_cpus; + + has_cpus = cpumask_and(new_cpus, cs->cpus_allowed, parent->effective_cpus); + if (!has_cpus && is_in_v2_mode()) + cpumask_copy(new_cpus, parent->effective_cpus); +} + +/** + * compute_effective_nodemask - Compute the effective nodemask of the cpuset + * @new_cpus: the temp variable for the new effective_mems mask + * @cs: the cpuset the need to recompute the new effective_mems mask + * @parent: the parent cpuset + * + * For v2, the parent's effective_mems is inherited if nodemask empty. + */ +static void compute_effective_nodemask(nodemask_t *new_mems, + struct cpuset *cs, struct cpuset *parent) +{ + bool has_mems; + + has_mems = nodes_and(*new_mems, cs->mems_allowed, parent->effective_mems); + if (!has_mems && is_in_v2_mode()) + nodes_copy(*new_mems, parent->effective_mems); } /* @@ -2148,15 +2171,6 @@ static void update_cpumasks_hier(struct cpuset *cs, struct tmpmasks *tmp, goto update_parent_effective; } - /* - * If it becomes empty, inherit the effective mask of the - * parent, which is guaranteed to have some CPUs unless - * it is a partition root that has explicitly distributed - * out all its CPUs. - */ - if (is_in_v2_mode() && !remote && cpumask_empty(tmp->new_cpus)) - cpumask_copy(tmp->new_cpus, parent->effective_cpus); - /* * Skip the whole subtree if * 1) the cpumask remains the same, @@ -2704,14 +2718,7 @@ static void update_nodemasks_hier(struct cpuset *cs, nodemask_t *new_mems) cpuset_for_each_descendant_pre(cp, pos_css, cs) { struct cpuset *parent = parent_cs(cp); - bool has_mems = nodes_and(*new_mems, cp->mems_allowed, parent->effective_mems); - - /* - * If it becomes empty, inherit the effective mask of the - * parent, which is guaranteed to have some MEMs. - */ - if (is_in_v2_mode() && !has_mems) - *new_mems = parent->effective_mems; + compute_effective_nodemask(new_mems, cp, parent); /* Skip the whole subtree if the nodemask remains the same. */ if (nodes_equal(*new_mems, cp->effective_mems)) { @@ -3923,7 +3930,7 @@ static void cpuset_hotplug_update_tasks(struct cpuset *cs, struct tmpmasks *tmp) parent = parent_cs(cs); compute_effective_cpumask(&new_cpus, cs, parent); - nodes_and(new_mems, cs->mems_allowed, parent->effective_mems); + compute_effective_nodemask(&new_mems, cs, parent); if (!tmp || !cs->partition_root_state) goto update_tasks; diff --git a/tools/testing/selftests/cgroup/test_cpuset_prs.sh b/tools/testing/selftests/cgroup/test_cpuset_prs.sh index 0d41aa0d343d..ca9bc38fdb95 100755 --- a/tools/testing/selftests/cgroup/test_cpuset_prs.sh +++ b/tools/testing/selftests/cgroup/test_cpuset_prs.sh @@ -495,13 +495,20 @@ REMOTE_TEST_MATRIX=( # Narrowing cpuset.cpus to previously sibling-excluded CPUs should # not return CPUs that were never actually owned. " C1-4:P1 . C1-2:P1 C1-3:P2 . . \ - . . . C3 . . p1:4|c11:1-2|c12:3 \ + . . . C3 . . p1:4|c11:1-2|c12:3 \ p1:P1|c11:P1|c12:P2 3" # Expanding cpuset.cpus to include a previously sibling-excluded CPU # after the sibling has become a member should correctly request it. " C1-4:P1 . C1-2:P1 C1-3:P2 . . \ - . . P0 C2-3 . . p1:1,4|c11:1|c12:2-3 \ + . . P0 C2-3 . . p1:1,4|c11:1|c12:2-3 \ p1:P1|c11:P0|c12:P2 2-3" + # Cpusets with empty cpuset.cpus should inherit parent's effective_cpus + " C1-4:P1 C5-6 C1-2 . C5 . \ + . P1 P1 . . . p1:3-4|p2:5-6|c11:1-2|c12:3-4|c21:5|c22:5-6 \ + p1:P1|p2:P1|c11:P1" + " C1-4:P1 C5-6 C1-2 . C5 . \ + . P1 P1 . O5=0 . p1:3-4|p2:6|c11:1-2|c12:3-4|c21:6|c22:6 \ + p1:P1|p2:P1|c11:P1" ) # -- 2.54.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2 1/2] cgroup/cpuset: Avoid unnecessary cpus & mems update in cpuset_hotplug_update_tasks() 2026-06-23 23:04 ` [PATCH v2 1/2] cgroup/cpuset: Avoid unnecessary cpus & mems update in cpuset_hotplug_update_tasks() Waiman Long @ 2026-06-24 5:51 ` Ridong Chen 2026-06-24 8:40 ` Manuel Ebner 1 sibling, 0 replies; 7+ messages in thread From: Ridong Chen @ 2026-06-24 5:51 UTC (permalink / raw) To: Waiman Long, Tejun Heo, Johannes Weiner, Michal Koutný, Jonathan Corbet, Shuah Khan Cc: cgroups, linux-kernel, linux-doc, linux-kselftest On 6/24/2026 7:04 AM, Waiman Long wrote: > As reported by sashiko [1], cpuset_hotplug_update_tasks() may perform > unnecessary task iteration and updating of tasks' CPU and node masks > when mems_allowed and/or cpus_allowed are not set in cpuset v2. It is > due to the fact that the temporary new_cpus and new_mems masks do not > inherit parent's effective_cpus/mems when they are empty which is the > expected behavior for cpuset v2 since commit 4ec22e9c5a90 ("cpuset: > Enable cpuset controller in default hierarchy"). > > Fix that and avoid unnecessay work by enhancing > compute_effective_cpumask() to add the empty cpumask check > and inheriting the parent's versions if empty when in v2. A new > compute_effective_nodemask() helper is also added to perform similar > function for new effective_mems. > > Add new test_cpuset_prs.sh test cases to confirm that effective_cpus > will inherit the parent's version if cpuset.cpus is empty. > > [1] https://sashiko.dev/#/patchset/20260621032816.1806773-1-longman%40redhat.com > > Suggested-by: Ridong Chen <ridong.chen@linux.dev> > Fixes: 4ec22e9c5a90 ("cpuset: Enable cpuset controller in default hierarchy") > Signed-off-by: Waiman Long <longman@redhat.com> > --- > kernel/cgroup/cpuset.c | 45 +++++++++++-------- > .../selftests/cgroup/test_cpuset_prs.sh | 11 ++++- > 2 files changed, 35 insertions(+), 21 deletions(-) > > diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c > index aff86acea701..044ddbf66f8e 100644 > --- a/kernel/cgroup/cpuset.c > +++ b/kernel/cgroup/cpuset.c > @@ -1094,12 +1094,35 @@ void cpuset_update_tasks_cpumask(struct cpuset *cs, struct cpumask *new_cpus) > * @cs: the cpuset the need to recompute the new effective_cpus mask > * @parent: the parent cpuset > * > + * For v2, the parent's effective_cpus is inherited if cpumask empty. > * The result is valid only if the given cpuset isn't a partition root. > */ > static void compute_effective_cpumask(struct cpumask *new_cpus, > struct cpuset *cs, struct cpuset *parent) > { > - cpumask_and(new_cpus, cs->cpus_allowed, parent->effective_cpus); > + bool has_cpus; > + > + has_cpus = cpumask_and(new_cpus, cs->cpus_allowed, parent->effective_cpus); > + if (!has_cpus && is_in_v2_mode()) > + cpumask_copy(new_cpus, parent->effective_cpus); > +} > + > +/** > + * compute_effective_nodemask - Compute the effective nodemask of the cpuset > + * @new_cpus: the temp variable for the new effective_mems mask > + * @cs: the cpuset the need to recompute the new effective_mems mask > + * @parent: the parent cpuset > + * > + * For v2, the parent's effective_mems is inherited if nodemask empty. > + */ > +static void compute_effective_nodemask(nodemask_t *new_mems, > + struct cpuset *cs, struct cpuset *parent) > +{ > + bool has_mems; > + > + has_mems = nodes_and(*new_mems, cs->mems_allowed, parent->effective_mems); > + if (!has_mems && is_in_v2_mode()) > + nodes_copy(*new_mems, parent->effective_mems); > } > > /* > @@ -2148,15 +2171,6 @@ static void update_cpumasks_hier(struct cpuset *cs, struct tmpmasks *tmp, > goto update_parent_effective; > } > > - /* > - * If it becomes empty, inherit the effective mask of the > - * parent, which is guaranteed to have some CPUs unless > - * it is a partition root that has explicitly distributed > - * out all its CPUs. > - */ > - if (is_in_v2_mode() && !remote && cpumask_empty(tmp->new_cpus)) > - cpumask_copy(tmp->new_cpus, parent->effective_cpus); > - > /* > * Skip the whole subtree if > * 1) the cpumask remains the same, > @@ -2704,14 +2718,7 @@ static void update_nodemasks_hier(struct cpuset *cs, nodemask_t *new_mems) > cpuset_for_each_descendant_pre(cp, pos_css, cs) { > struct cpuset *parent = parent_cs(cp); > > - bool has_mems = nodes_and(*new_mems, cp->mems_allowed, parent->effective_mems); > - > - /* > - * If it becomes empty, inherit the effective mask of the > - * parent, which is guaranteed to have some MEMs. > - */ > - if (is_in_v2_mode() && !has_mems) > - *new_mems = parent->effective_mems; > + compute_effective_nodemask(new_mems, cp, parent); > > /* Skip the whole subtree if the nodemask remains the same. */ > if (nodes_equal(*new_mems, cp->effective_mems)) { > @@ -3923,7 +3930,7 @@ static void cpuset_hotplug_update_tasks(struct cpuset *cs, struct tmpmasks *tmp) > > parent = parent_cs(cs); > compute_effective_cpumask(&new_cpus, cs, parent); > - nodes_and(new_mems, cs->mems_allowed, parent->effective_mems); > + compute_effective_nodemask(&new_mems, cs, parent); > > if (!tmp || !cs->partition_root_state) > goto update_tasks; > diff --git a/tools/testing/selftests/cgroup/test_cpuset_prs.sh b/tools/testing/selftests/cgroup/test_cpuset_prs.sh > index 0d41aa0d343d..ca9bc38fdb95 100755 > --- a/tools/testing/selftests/cgroup/test_cpuset_prs.sh > +++ b/tools/testing/selftests/cgroup/test_cpuset_prs.sh > @@ -495,13 +495,20 @@ REMOTE_TEST_MATRIX=( > # Narrowing cpuset.cpus to previously sibling-excluded CPUs should > # not return CPUs that were never actually owned. > " C1-4:P1 . C1-2:P1 C1-3:P2 . . \ > - . . . C3 . . p1:4|c11:1-2|c12:3 \ > + . . . C3 . . p1:4|c11:1-2|c12:3 \ > p1:P1|c11:P1|c12:P2 3" > # Expanding cpuset.cpus to include a previously sibling-excluded CPU > # after the sibling has become a member should correctly request it. > " C1-4:P1 . C1-2:P1 C1-3:P2 . . \ > - . . P0 C2-3 . . p1:1,4|c11:1|c12:2-3 \ > + . . P0 C2-3 . . p1:1,4|c11:1|c12:2-3 \ > p1:P1|c11:P0|c12:P2 2-3" > + # Cpusets with empty cpuset.cpus should inherit parent's effective_cpus > + " C1-4:P1 C5-6 C1-2 . C5 . \ > + . P1 P1 . . . p1:3-4|p2:5-6|c11:1-2|c12:3-4|c21:5|c22:5-6 \ > + p1:P1|p2:P1|c11:P1" > + " C1-4:P1 C5-6 C1-2 . C5 . \ > + . P1 P1 . O5=0 . p1:3-4|p2:6|c11:1-2|c12:3-4|c21:6|c22:6 \ > + p1:P1|p2:P1|c11:P1" > ) > > # LGTM. Reviewed-by: Ridong Chen <ridong.chen@linux.dev> -- Best regards Ridong ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 1/2] cgroup/cpuset: Avoid unnecessary cpus & mems update in cpuset_hotplug_update_tasks() 2026-06-23 23:04 ` [PATCH v2 1/2] cgroup/cpuset: Avoid unnecessary cpus & mems update in cpuset_hotplug_update_tasks() Waiman Long 2026-06-24 5:51 ` Ridong Chen @ 2026-06-24 8:40 ` Manuel Ebner 1 sibling, 0 replies; 7+ messages in thread From: Manuel Ebner @ 2026-06-24 8:40 UTC (permalink / raw) To: Waiman Long, Tejun Heo, Johannes Weiner, Michal Koutný, Ridong Chen, Jonathan Corbet, Shuah Khan Cc: cgroups, linux-kernel, linux-doc, linux-kselftest On Tue, 2026-06-23 at 19:04 -0400, Waiman Long wrote: > As reported by sashiko [1], cpuset_hotplug_update_tasks() may perform > unnecessary task iteration and updating of tasks' CPU and node masks > when mems_allowed and/or cpus_allowed are not set in cpuset v2. It is > due to the fact that the temporary new_cpus and new_mems masks do not > inherit parent's effective_cpus/mems when they are empty which is the > expected behavior for cpuset v2 since commit 4ec22e9c5a90 ("cpuset: > Enable cpuset controller in default hierarchy"). > > Fix that and avoid unnecessay work by enhancing > compute_effective_cpumask() to add the empty cpumask check > and inheriting the parent's versions if empty when in v2. A new > compute_effective_nodemask() helper is also added to perform similar > function for new effective_mems. perform a similar function or perform similar functions > [...] > diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c > index aff86acea701..044ddbf66f8e 100644 > --- a/kernel/cgroup/cpuset.c > +++ b/kernel/cgroup/cpuset.c > @@ -1094,12 +1094,35 @@ void cpuset_update_tasks_cpumask(struct cpuset *cs, struct > cpumask *new_cpus) > * @cs: the cpuset the need to recompute the new effective_cpus mask > * @parent: the parent cpuset > * > + * For v2, the parent's effective_cpus is inherited if cpumask empty. + * For v2, the parent's effective_cpus is inherited if cpumask is empty. Thanks Manuel ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2 2/2] cgroup/cpuset: Rebind/migrate mm only for threadgroup leader in cpuset_update_tasks_nodemask() 2026-06-23 23:04 [PATCH v2 0/2] cgroup/cpuset: Miscellaneous fixes and cleanups Waiman Long 2026-06-23 23:04 ` [PATCH v2 1/2] cgroup/cpuset: Avoid unnecessary cpus & mems update in cpuset_hotplug_update_tasks() Waiman Long @ 2026-06-23 23:04 ` Waiman Long 2026-06-24 8:27 ` Manuel Ebner 2026-06-24 19:47 ` [PATCH v2 0/2] cgroup/cpuset: Miscellaneous fixes and cleanups Tejun Heo 2 siblings, 1 reply; 7+ messages in thread From: Waiman Long @ 2026-06-23 23:04 UTC (permalink / raw) To: Tejun Heo, Johannes Weiner, Michal Koutný, Ridong Chen, Jonathan Corbet, Shuah Khan Cc: cgroups, linux-kernel, linux-doc, linux-kselftest, Waiman Long As reported by sashiko [1], cpuset_update_tasks_nodemask() will do mpol_rebind_mm() and possibly cpuset_migrate_mm() for all threads of a multithreaded process. Since commit 3df9ca0a2b8b ("cpuset: migrate memory only for threadgroup leaders"), cpuset_attach() had been updated to rebind and migrate memory only for threadgroup leaders to mark the group leader as the owner of the mm_struct. To be consistent and avoid unnecessary performance overhead for heavily multithreaded processes, follow the cpuset_attach() example and perform memory rebind and migration only for threadgroup leaders. Also add a paragraph in cgroup-v2.rst under cpuset.mems that the threadgroup leader is the memory owner of that threadgroup. Therefore the non-leading threads shouldn't be in other cgroups whose "cpuset.mems" doesn't fully overlap that of the group leader. [1] https://sashiko.dev/#/patchset/20260621032816.1806773-1-longman%40redhat.com Signed-off-by: Waiman Long <longman@redhat.com> Reviewed-by: Ridong Chen <ridong.chen@linux.dev> --- Documentation/admin-guide/cgroup-v2.rst | 7 +++++++ kernel/cgroup/cpuset.c | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/Documentation/admin-guide/cgroup-v2.rst b/Documentation/admin-guide/cgroup-v2.rst index 993446ab66d0..f9c353174a7e 100644 --- a/Documentation/admin-guide/cgroup-v2.rst +++ b/Documentation/admin-guide/cgroup-v2.rst @@ -2527,6 +2527,13 @@ Cpuset Interface Files a need to change "cpuset.mems" with active tasks, it shouldn't be done frequently. + For a multithreaded process, the threadgroup leader is + considered the owner of the group's memory. Memory policy + rebinding and migration will only happen with respect to the + threadgroup leader. To avoid unexpected result, non-leading + threads shouldn't be put into another cgroup whose "cpuset.mems" + doesn't fully overlap that of the threadgroup leader. + cpuset.mems.effective A read-only multiple values file which exists on all cpuset-enabled cgroups. diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c index 044ddbf66f8e..055ae54a040a 100644 --- a/kernel/cgroup/cpuset.c +++ b/kernel/cgroup/cpuset.c @@ -2673,6 +2673,10 @@ void cpuset_update_tasks_nodemask(struct cpuset *cs) cpuset_change_task_nodemask(task, &newmems); + /* Rebind and migrate mm only for thread group leader */ + if (!thread_group_leader(task)) + continue; + mm = get_task_mm(task); if (!mm) continue; -- 2.54.0 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2 2/2] cgroup/cpuset: Rebind/migrate mm only for threadgroup leader in cpuset_update_tasks_nodemask() 2026-06-23 23:04 ` [PATCH v2 2/2] cgroup/cpuset: Rebind/migrate mm only for threadgroup leader in cpuset_update_tasks_nodemask() Waiman Long @ 2026-06-24 8:27 ` Manuel Ebner 0 siblings, 0 replies; 7+ messages in thread From: Manuel Ebner @ 2026-06-24 8:27 UTC (permalink / raw) To: Waiman Long, Tejun Heo, Johannes Weiner, Michal Koutný, Ridong Chen, Jonathan Corbet, Shuah Khan Cc: cgroups, linux-kernel, linux-doc, linux-kselftest Hi On Tue, 2026-06-23 at 19:04 -0400, Waiman Long wrote: > [...] > Also add a paragraph in cgroup-v2.rst under cpuset.mems that the > threadgroup leader is the memory owner of that threadgroup. Therefore > the non-leading threads shouldn't be in other cgroups whose "cpuset.mems" > doesn't fully overlap that of the group leader. This sentence is long and complex, split into two if possible. I couldn't figure out how to do so. > [...] > --- a/Documentation/admin-guide/cgroup-v2.rst > +++ b/Documentation/admin-guide/cgroup-v2.rst > @@ -2527,6 +2527,13 @@ Cpuset Interface Files > a need to change "cpuset.mems" with active tasks, it shouldn't > be done frequently. > > + For a multithreaded process, the threadgroup leader is > + considered the owner of the group's memory. Memory policy > + rebinding and migration will only happen with respect to the > + threadgroup leader. To avoid unexpected result, non-leading /result/results/ or To avoid an unexpected result, > + threads shouldn't be put into another cgroup whose "cpuset.mems" > + doesn't fully overlap that of the threadgroup leader. maybe /threadgroup/threadgroups/ Thanks Manuel ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2 0/2] cgroup/cpuset: Miscellaneous fixes and cleanups 2026-06-23 23:04 [PATCH v2 0/2] cgroup/cpuset: Miscellaneous fixes and cleanups Waiman Long 2026-06-23 23:04 ` [PATCH v2 1/2] cgroup/cpuset: Avoid unnecessary cpus & mems update in cpuset_hotplug_update_tasks() Waiman Long 2026-06-23 23:04 ` [PATCH v2 2/2] cgroup/cpuset: Rebind/migrate mm only for threadgroup leader in cpuset_update_tasks_nodemask() Waiman Long @ 2026-06-24 19:47 ` Tejun Heo 2 siblings, 0 replies; 7+ messages in thread From: Tejun Heo @ 2026-06-24 19:47 UTC (permalink / raw) To: Waiman Long Cc: Johannes Weiner, Michal Koutný, Ridong Chen, Jonathan Corbet, Shuah Khan, cgroups, linux-kernel, linux-doc, linux-kselftest > Waiman Long (2): > cgroup/cpuset: Avoid unnecessary cpus & mems update in > cpuset_hotplug_update_tasks() > cgroup/cpuset: Rebind/migrate mm only for threadgroup leader in > cpuset_update_tasks_nodemask() Applied 1-2 to cgroup/for-7.3. I folded in a few minor fixups: a changelog typo, the compute_effective_nodemask() kerneldoc parameter name (new_cpus to new_mems), and the comment and doc grammar nits Manuel noted. Also added Ridong's Reviewed-by to patch 1. Thanks. -- tejun ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-06-24 19:47 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2026-06-23 23:04 [PATCH v2 0/2] cgroup/cpuset: Miscellaneous fixes and cleanups Waiman Long 2026-06-23 23:04 ` [PATCH v2 1/2] cgroup/cpuset: Avoid unnecessary cpus & mems update in cpuset_hotplug_update_tasks() Waiman Long 2026-06-24 5:51 ` Ridong Chen 2026-06-24 8:40 ` Manuel Ebner 2026-06-23 23:04 ` [PATCH v2 2/2] cgroup/cpuset: Rebind/migrate mm only for threadgroup leader in cpuset_update_tasks_nodemask() Waiman Long 2026-06-24 8:27 ` Manuel Ebner 2026-06-24 19:47 ` [PATCH v2 0/2] cgroup/cpuset: Miscellaneous fixes and cleanups Tejun Heo
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox