Re: [PATCH-next v3 1/3] cgroup/cpuset: Correctly set cpus_updated in cpuset_hotplug_update_tasks()
From: Guopeng Zhang
Date: Wed Nov 11 2026 - 10:07:44 EST
在 2026/11/11 10:02, Waiman Long 写道:
> When cpuset_hotplug_update_tasks() is called with the conditions that
> remote_partition_disable() has to be called, the cs->effective_cpus will
> be updated such that it matches what is computed in new_cpus. In such
> case, cpus_updated can be incorrectly set to false leading to stale CPU
> afinity remained in the tasks not matching the new cpuset value. Fix that
> by forcing cpus_updated to true after calling remote_partition_disable().
>
> Fixes: 181c8e091aae ("cgroup/cpuset: Introduce remote partition")
> Reported-by: Sashiko <sashiko-bot@xxxxxxxxxx>
> Link: https://sashiko.dev/#/bug/linux-ab90f7e8-0d60-40ca-83e9-e405075b24d2
> Signed-off-by: Waiman Long <longman@xxxxxxxxxx>
> ---
> kernel/cgroup/cpuset.c | 9 +++++++--
> 1 file changed, 7 insertions(+), 2 deletions(-)
>
> diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c
> index 8a8a424a389f..862864b44960 100644
> --- a/kernel/cgroup/cpuset.c
> +++ b/kernel/cgroup/cpuset.c
> @@ -4031,7 +4031,7 @@ static void cpuset_hotplug_update_tasks(struct cpuset *cs, struct tmpmasks *tmp)
> {
> static cpumask_t new_cpus;
> static nodemask_t new_mems;
> - bool cpus_updated;
> + bool cpus_updated = false;
> bool mems_updated;
> int partcmd = -1;
> struct cpuset *parent;
> @@ -4044,12 +4044,17 @@ static void cpuset_hotplug_update_tasks(struct cpuset *cs, struct tmpmasks *tmp)
> if (!tmp || !cs->partition_root_state)
> goto update_tasks;
>
> + /*
> + * cpus_updated should be set to true when remote_partition_disable()
> + * is called as cs->effective_cpus will be modified.
> + */
> if (is_remote_partition(cs) && (cpumask_empty(subpartitions_cpus) ||
> (cpumask_empty(&new_cpus) &&
> partition_is_populated(cs, NULL)))) {
> WRITE_ONCE(cs->prs_err, PERR_HOTPLUG);
> remote_partition_disable(cs, tmp);
> compute_effective_cpumask(&new_cpus, cs, parent);
> + cpus_updated = true;
> }
>
> /*
> @@ -4082,7 +4087,7 @@ static void cpuset_hotplug_update_tasks(struct cpuset *cs, struct tmpmasks *tmp)
> }
>
> update_tasks:
> - cpus_updated = !cpumask_equal(&new_cpus, cs->effective_cpus);
> + cpus_updated |= !cpumask_equal(&new_cpus, cs->effective_cpus);
> mems_updated = !nodes_equal(new_mems, cs->effective_mems);
> if (!cpus_updated && !mems_updated)
> goto unlock; /* Hotplug doesn't affect this cpuset */
Reviewed-by: Guopeng Zhang <zhangguopeng@xxxxxxxxxx>
Tested-by: Guopeng Zhang <zhangguopeng@xxxxxxxxxx>
Thanks,
Guopeng