From: Guopeng Zhang <guopeng.zhang@linux.dev>
To: "Waiman Long" <longman@redhat.com>,
"Ridong Chen" <ridong.chen@linux.dev>,
"Tejun Heo" <tj@kernel.org>,
"Johannes Weiner" <hannes@cmpxchg.org>,
"Michal Koutný" <mkoutny@suse.com>,
"Shuah Khan" <shuah@kernel.org>
Cc: cgroups@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-kselftest@vger.kernel.org
Subject: Re: [PATCH v2 3/3] cgroup/cpuset: Do housekeeping check when isolated child with root parent may get more xcpus
Date: Mon, 2 Nov 2026 09:30:05 +0800 [thread overview]
Message-ID: <7f98f3d6-07f0-4117-92e7-91d9bb802972@linux.dev> (raw)
In-Reply-To: <20261030190701.78308-4-longman@redhat.com>
在 2026/10/31 03:07, Waiman Long 写道:
> It is reported by sashiko and Guopeng that when an isolated child with
> root parent gets more isolated CPUs from the expansion of the parent's
> effective_xcpus, it is possible that all the active housekeeping CPUs
> may be gone. So a prstate_housekeeping_conflict() should be performed
> when that happens. Add the check to make sure that we can't exhaust
> all the active housekeeping CPUs.
>
> Test cases are added to the NOHZ_FULL_TEST_MATRIX of test_cpuset_prs.sh
> to test that.
>
> Reported-by: Guopeng Zhang <guopeng.zhang@linux.dev>
> Link: https://lore.kernel.org/lkml/ed6fecb4-38e9-4a73-8c1a-7bdd80175a69@linux.dev
> Fixes: e2ffe502ba45 ("cgroup/cpuset: Add cpuset.cpus.exclusive for v2")
> Signed-off-by: Waiman Long <longman@redhat.com>
> ---
> kernel/cgroup/cpuset.c | 18 +++++++++++++++---
> .../selftests/cgroup/test_cpuset_prs.sh | 10 ++++++++--
> 2 files changed, 23 insertions(+), 5 deletions(-)
>
> diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c
> index ed014ecb770c..6e136888fc8e 100644
> --- a/kernel/cgroup/cpuset.c
> +++ b/kernel/cgroup/cpuset.c
> @@ -2119,10 +2119,22 @@ static int update_parent_effective_cpumask(struct cpuset *cs, int cmd,
> * If there is an expansion of parent's effective_xcpus,
> * we may take more xcpus from parent. The parent's
> * effective_cpus should still have active CPUs or nocpu
> - * should have been set.
> + * should have been set. We also need to do a
> + * housekeeping check for an isolated child with root
> + * parent to make sure that it won't exhaust all the
> + * active housekeeping CPUs.
> */
> - deleting = cpumask_andnot(tmp->delmask, tmp->delmask,
> - cs->effective_xcpus);
> + cpumask_andnot(tmp->addmask, cs->effective_xcpus, tmp->delmask);
> + if ((parent_prs == PRS_ROOT) && (old_prs == PRS_ISOLATED) &&
> + prstate_housekeeping_conflict(old_prs, parent_prs,
> + tmp->delmask, tmp->addmask)) {
> + adding = cpumask_and(tmp->addmask, cs->effective_xcpus,
> + tmp->delmask);
> + part_error = PERR_HKEEPING;
> + } else {
> + deleting = cpumask_andnot(tmp->delmask, tmp->delmask,
> + cs->effective_xcpus);
> + }
> } else if (is_partition_invalid(cs)) {
> struct cgroup_subsys_state *css;
> struct cpuset *child;
> diff --git a/tools/testing/selftests/cgroup/test_cpuset_prs.sh b/tools/testing/selftests/cgroup/test_cpuset_prs.sh
> index 844efdf029cd..bdca6c471f87 100755
> --- a/tools/testing/selftests/cgroup/test_cpuset_prs.sh
> +++ b/tools/testing/selftests/cgroup/test_cpuset_prs.sh
> @@ -137,7 +137,8 @@ LAST_PRESENT_CPU=$(cat /sys/devices/system/cpu/present | sed -e "s/.*[,-]//")
> # If isolated CPUs have been reserved at boot time (as shown in
> # /sys/devices/system/cpu/isolated), these isolated CPUs should be outside of
> # CPUs 0-8 that will be used by this script for testing purpose. If not, some
> -# of the tests may fail incorrectly.
> +# of the tests may fail incorrectly. The first boot isolated CPU should be
> +# 10 or above.
> #
> # The current set of isolated CPUs (as shown in cpuset.cpus.isolated) should
> # be the same as the boot value. If not, wait a bit and retry again just in
> @@ -156,7 +157,7 @@ TEST_ISOLCPUS=
> [[ -n "$BOOT_ISOLCPUS" ]] && {
> FIRST_ISOLCPUS=$(echo $BOOT_ISOLCPUS | sed -e "s/[,-].*//")
> echo "Boot isolated CPUs: $BOOT_ISOLCPUS"
> - [[ $FIRST_ISOLCPUS -le 8 ]] &&
> + [[ $FIRST_ISOLCPUS -le 9 ]] &&
> skip_test "Boot isolated CPUs overlap CPUs to be tested"
> }
>
> @@ -602,6 +603,7 @@ ISOLCPUS_TEST_MATRIX=(
> )
>
> # Test matrix to be run when boot time nohz_full CPUs cover all CPUs except CPUs 0-7
> +# This also means that CPU 8 is available and is a nohz_full CPU.
> NOHZ_FULL_TEST_MATRIX=(
> # old-A1 old-A2 old-A3 old-B1 new-A1 new-A2 new-A3 new-B1 fail ECPUs Pstate ISOLCPUS
> # ------ ------ ------ ------ ------ ------ ------ ------ ---- ----- ------ --------
> @@ -610,6 +612,10 @@ NOHZ_FULL_TEST_MATRIX=(
> " C2-7:P2 . . . C0-4 . . . 0 A1:0-4 A1:P2 0-4"
> " C1-7:P2 C5-7:P2 . . . . . C0:P2 0 A1:1-4|A2:5-7|B1:0
> A1:P2|A2:P2|B1:P-2 1-7"
> + # An isolated child partition cannot grow to take over the last
> + # housekeeping CPU when its parent expands the exclusive CPUs.
> + " C0-8:X1-8:P1 CX0-8:P2 . . X0-7 . . . 0 A1:0-7|A2:0-7 A1:P1|A2:P-2 ."
> + " C0-8:X0-6:P1 CX0-8:P2 . . X2-8 . . . 0 A1:|A2:2-8 A1:P1|A2:P2 2-8"
> )
>
> #
Reviewed-by: Guopeng Zhang <zhangguopeng@kylinos.cn>
Tested-by: Guopeng Zhang <zhangguopeng@kylinos.cn>
Thanks,
Guopeng
next prev parent reply other threads:[~2026-11-02 1:30 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-30 19:06 [PATCH v2 0/3] cgroup/cpuset: Fix some more bugs in cpuset partition code Waiman Long
2026-10-30 19:06 ` [PATCH v2 1/3] cgroup/cpuset: Fix incorrect CPU accounting with parent's effective_xcpus expansion Waiman Long
2026-11-02 1:28 ` Guopeng Zhang
2026-10-30 19:07 ` [PATCH v2 2/3] cgroup/cpuset: Recompute effective cpumask in update_cpumasks_hier() after calling update_parent_effective_cpumask() Waiman Long
2026-11-02 1:28 ` Guopeng Zhang
2026-10-30 19:07 ` [PATCH v2 3/3] cgroup/cpuset: Do housekeeping check when isolated child with root parent may get more xcpus Waiman Long
2026-11-02 1:30 ` Guopeng Zhang [this message]
2026-11-02 8:04 ` [PATCH v2 0/3] cgroup/cpuset: Fix some more bugs in cpuset partition code Tejun Heo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7f98f3d6-07f0-4117-92e7-91d9bb802972@linux.dev \
--to=guopeng.zhang@linux.dev \
--cc=cgroups@vger.kernel.org \
--cc=hannes@cmpxchg.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=longman@redhat.com \
--cc=mkoutny@suse.com \
--cc=ridong.chen@linux.dev \
--cc=shuah@kernel.org \
--cc=tj@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.