Re: [PATCH-next v3 03/11] cgroup/cpuset: Fix incorrect effective_cpus bug in update_cpumasks_hier()
From: Guopeng Zhang
Date: Mon Oct 26 2026 - 02:48:13 EST
在 2026/10/26 05:44, Waiman Long 写道:
> With the introduction of cpuset.cpus.exclusive, the computation of
> effective_cpus differs depending on if a cpuset is a valid partition
> root or not.
>
> In update_cpumasks_hier(), effective_cpus is computed early
> to check if the current subtree can be skipped. Later on
> update_parent_effective_cpumask() may be called which can change the
> partition state from valid to invalid or vice versa. If the partition
> state changes, the previously computed effective_cpus may no longer be
> valid. Fix that by recomputing effective_cpus again when that happens.
>
> Also add a new test case into test_cpuset_prs.sh to verify this change.
>
> Fixes: e2ffe502ba45 ("cgroup/cpuset: Add cpuset.cpus.exclusive for v2")
> Signed-off-by: Waiman Long <longman@xxxxxxxxxx>
> ---
> kernel/cgroup/cpuset.c | 10 ++++++++--
> tools/testing/selftests/cgroup/test_cpuset_prs.sh | 3 +++
> 2 files changed, 11 insertions(+), 2 deletions(-)
>
> diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c
> index b850aba4d907..37bc79d0c647 100644
> --- a/kernel/cgroup/cpuset.c
> +++ b/kernel/cgroup/cpuset.c
> @@ -2327,10 +2327,16 @@ static void update_cpumasks_hier(struct cpuset *cs, struct tmpmasks *tmp,
> if (update_parent) {
> update_parent_effective_cpumask(cp, partcmd_update, NULL, tmp);
> /*
> - * The cpuset partition_root_state may become
> - * invalid. Capture it.
> + * Capture current partition_root_state as it may have
> + * changed. Recompute effective cpumask if changed.
> */
> new_prs = cp->partition_root_state;
> + if (new_prs != old_prs) {
> + if (new_prs > 0)
> + compute_partition_effective_cpumask(cp, tmp->new_cpus);
> + else
> + compute_effective_cpumask(tmp->new_cpus, cp, parent);
> + }
> }
>
> spin_lock_irq(&callback_lock);
> diff --git a/tools/testing/selftests/cgroup/test_cpuset_prs.sh b/tools/testing/selftests/cgroup/test_cpuset_prs.sh
> index 8bdda955b4a7..f4eb984752a0 100755
> --- a/tools/testing/selftests/cgroup/test_cpuset_prs.sh
> +++ b/tools/testing/selftests/cgroup/test_cpuset_prs.sh
> @@ -364,6 +364,9 @@ TEST_MATRIX=(
> " C1-4:X2-4 C2-4:X3-4:P1 C3-4:X4:P2 \
> . . X5 . . 0 A1:1-4|A2:2-4|A3:3-4 \
> A1:P0|A2:P-1|A3:P-2 ."
> + " C1-5:X3-5:P2 C3-5:X4-5:P2 C4-5:X5:P2 \
> + . X1-4 . . . 0 A1:1-3|A2:4|A3:4 \
> + A1:P2|A2:P2|A3:P-2 1-4"
> " C1-4:X2-4 C1-4:X3-4:P1 C3-4:X4:P2 \
> . . . X1 . 0 A1:1-2|A2:3-4|A3:3-4 \
> A1:P0|A2:P1|A3:P-2 ."
Reviewed-by: Guopeng Zhang <zhangguopeng@xxxxxxxxxx>
Thanks,
Guopeng