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>,
"Jonathan Corbet" <corbet@lwn.net>,
"Randy Dunlap" <rdunlap@infradead.org>
Cc: cgroups@vger.kernel.org, linux-doc@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org,
Hui Peng <benquike@gmail.com>
Subject: Re: [PATCH-next v3 6/9] cgroup/cpuset: Don't allow a child root partition under an isolated parent
Date: Fri, 16 Oct 2026 11:30:47 +0800 [thread overview]
Message-ID: <497db854-17ba-47ae-a9e0-8f1dacb0b205@linux.dev> (raw)
In-Reply-To: <20261014140548.575122-7-longman@redhat.com>
在 2026/10/14 22:05, Waiman Long 写道:
> Although it is not typical for real users to create a complicated nested
> partition hierarchy, it is currently allowed to create nested root and
> isolated partitions. In addition, disabling or invalidating a partition
> should always be allowed especially when the cpuset is being deleted.
>
> With a nested root and isolated partition hierarchy, it is possible
> that all active housekeeping CPUs can be exhausted when disabling or
> invalidating a root partition and returning its CPUs to the isolated
> parent.
>
> One way to avoid this problem is to disallow the creation of a root
> partition under an isolated parent. It is indeed a new limitation imposed
> on the existing cpuset partition functionality. However an isolated
> partition is usually a left node where scheduling and some other kernel
> noises are disabled. It doesn't make much sense to create a child root
> partition under an isolated parent and remove some CPUs from the set
> of isolated CPUs again. Creation of a child isolated partition under a
> root or isolated parent is still allowed.
>
> The cgroup-v2 documentation is also updated to reflect this new
> limitation. New test cases are added to test_cpuset_prs.sh to verify
> this new behavior. Some existing test cases are also updated accordingly.
>
> Signed-off-by: Waiman Long <longman@redhat.com>
> ---
> Documentation/admin-guide/cgroup-v2.rst | 4 +++-
> kernel/cgroup/cpuset-internal.h | 1 +
> kernel/cgroup/cpuset.c | 13 +++++++++++++
> tools/testing/selftests/cgroup/test_cpuset_prs.sh | 14 ++++++++------
> 4 files changed, 25 insertions(+), 7 deletions(-)
>
> diff --git a/Documentation/admin-guide/cgroup-v2.rst b/Documentation/admin-guide/cgroup-v2.rst
> index bd8c80f3bbc9..2c445829e24d 100644
> --- a/Documentation/admin-guide/cgroup-v2.rst
> +++ b/Documentation/admin-guide/cgroup-v2.rst
> @@ -2767,7 +2767,9 @@ Cpuset Interface Files
> be retained, but behaves more like a "member".
>
> All possible state transitions among "member", "root" and
> - "isolated" are allowed.
> + "isolated" are allowed with the exception that a local child
> + "root" partition is not allowed to be created under an "isolated"
> + parent partition.
>
> On read, the "cpuset.cpus.partition" file can show the following
> values.
> diff --git a/kernel/cgroup/cpuset-internal.h b/kernel/cgroup/cpuset-internal.h
> index 5da9c91295b0..2e44dc8634dc 100644
> --- a/kernel/cgroup/cpuset-internal.h
> +++ b/kernel/cgroup/cpuset-internal.h
> @@ -35,6 +35,7 @@ enum prs_errcode {
> PERR_HKEEPING,
> PERR_ACCESS,
> PERR_REMOTE,
> + PERR_ISOPARENT,
> };
>
> /* bits in struct cpuset flags field */
> diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c
> index 40c004386af0..681701ba46e1 100644
> --- a/kernel/cgroup/cpuset.c
> +++ b/kernel/cgroup/cpuset.c
> @@ -60,6 +60,7 @@ static const char * const perr_strings[] = {
> [PERR_HKEEPING] = "partition config conflicts with housekeeping setup",
> [PERR_ACCESS] = "Enable partition not permitted",
> [PERR_REMOTE] = "Have remote partition underneath",
> + [PERR_ISOPARENT] = "Root partition is not allowed with isolated parent",
> };
>
> /*
> @@ -2865,6 +2866,7 @@ static int update_prstate(struct cpuset *cs, int new_prs)
> int err = PERR_NONE, old_prs = cs->partition_root_state;
> struct cpuset *parent = parent_cs(cs);
> struct tmpmasks tmpmask;
> + int parent_prs = parent->partition_root_state;
> bool isolcpus_updated = false;
> bool disable_partition = false;
>
> @@ -2910,6 +2912,14 @@ static int update_prstate(struct cpuset *cs, int new_prs)
> enum partition_cmd cmd = (new_prs == PRS_ROOT)
> ? partcmd_enable : partcmd_enablei;
>
> + /*
> + * It is not allowed to create a root partition under
> + * an isolated parent partition.
> + */
> + if ((new_prs == PRS_ROOT) && (parent_prs == PRS_ISOLATED)) {
> + err = PERR_ISOPARENT;
> + goto out;
> + }
I tested the following case. Writing root initially leaves C invalid, but
updating its cpuset.cpus makes it valid again.
CPUs 0-15 are online, with nohz_full=2-15 and no isolcpus:
# cd /sys/fs/cgroup
# echo +cpuset > cgroup.subtree_control
# mkdir A
# echo 1-2 > A/cpuset.cpus
# echo isolated > A/cpuset.cpus.partition
# echo +cpuset > A/cgroup.subtree_control
# mkdir A/C
# echo 1 > A/C/cpuset.cpus
# echo root > A/C/cpuset.cpus.partition
# cat A/C/cpuset.cpus.partition
root invalid (Root partition is not allowed with isolated parent)
# echo 1-2 > A/C/cpuset.cpus
# cat A/C/cpuset.cpus.partition
root
C becomes a valid root partition.
Thanks,
Guopeng
> err = update_parent_effective_cpumask(cs, cmd, NULL, &tmpmask);
> } else {
> err = remote_partition_enable(cs, new_prs, &tmpmask);
> @@ -2922,6 +2932,9 @@ static int update_prstate(struct cpuset *cs, int new_prs)
> if (prstate_housekeeping_conflict(new_prs, cs->effective_xcpus)) {
> disable_partition = true;
> err = PERR_HKEEPING;
> + } else if (parent_prs == PRS_ISOLATED) {
> + disable_partition = true;
> + err = PERR_ISOPARENT;
> } else {
> isolcpus_updated = true;
> }
> diff --git a/tools/testing/selftests/cgroup/test_cpuset_prs.sh b/tools/testing/selftests/cgroup/test_cpuset_prs.sh
> index 874a8a161236..85a4f87840b4 100755
> --- a/tools/testing/selftests/cgroup/test_cpuset_prs.sh
> +++ b/tools/testing/selftests/cgroup/test_cpuset_prs.sh
> @@ -288,16 +288,12 @@ TEST_MATRIX=(
> A1:P0|A2:P1|A3:P0|B1:P1"
> " C0-3 C1-3 C3 C4 X2-3 X2-3:P1 P2 P1 0 A1:0-1|A2:2|A3:3|B1:4 \
> A1:P0|A2:P1|A3:P2|B1:P1 2-4|3"
> - " C0-4 C1-4 C2-4 . X2-4 X2-4:P2 X4:P1 . 0 A1:0-1|A2:2-3|A3:4 \
> - A1:P0|A2:P2|A3:P1 2-4|2-3"
> - " C0-4 C1-4 C2-4 . X2-4 X2-4:P2 X3-4:P1 . 0 A1:0-1|A2:2|A3:3-4 \
> - A1:P0|A2:P2|A3:P1 2"
> " C0-4:X2-4 C1-4:X2-4:P1 C2-4:X4:P2 \
> . . X5 . . 0 A1:0-4|A2:1-4|A3:2-4 \
> A1:P0|A2:P-1|A3:P-2 ."
> - " C0-4:X2-4 C1-4:X2-4:P2 C2-4:X4:P1 \
> + " C0-4:X2-4 C1-4:X2-4:P1 C2-4:X4:P2 \
> . . . X1 . 0 A1:0-1|A2:2-4|A3:2-4 \
> - A1:P0|A2:P2|A3:P-1 2-4"
> + A1:P0|A2:P1|A3:P-2 ."
> " CX1-3:P1 CX1-3 CX1-3 . . . P1 . 0 A1:1-3|A2:1-3|A3:1-3 \
> A1:P1|A2:P0|A3:P-1"
>
> @@ -430,6 +426,12 @@ TEST_MATRIX=(
> # cpuset.cpus can become empty with task in it as it inherits parent's effective CPUs
> " C1-3 C2 . . . T:C . . 0 A1:1-3|A2:1-3"
>
> + # Creation of root partition under an isolated partition is not allowed
> + " C1-3:P2 C2 . . . P1 . . 0 A1:1-3|A2:2 A1:P2|A2:P-1 1-3"
> + " C1-3:P2 C2 . . . P2 . . 0 A1:1,3|A2:2 A1:P2|A2:P2 1-3"
> + " C1-3:P2 C2:P2 . . . P1 . . 0 A1:1-3|A2:2 A1:P2|A2:P-1 1-3"
> +
> + #
> # old-A1 old-A2 old-A3 old-B1 new-A1 new-A2 new-A3 new-B1 fail ECPUs Pstate ISOLCPUS
> # ------ ------ ------ ------ ------ ------ ------ ------ ---- ----- ------ --------
> # Failure cases:
next prev parent reply other threads:[~2026-10-16 3:30 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-14 14:05 [PATCH-next v3 0/9] cgroup/cpuset: Fix various housekeeping check problems Waiman Long
2026-10-14 14:05 ` [PATCH-next v3 1/9] cgroup/cpuset: Fix a missing isolated_cpus update in update_cpumasks_hier() Waiman Long
2026-10-15 13:02 ` Guopeng Zhang
2026-10-14 14:05 ` [PATCH-next v3 2/9] cgroup/cpuset: Consolidate isolated_cpus_can_update() into prstate_housekeeping_conflict() Waiman Long
2026-10-15 13:03 ` Guopeng Zhang
2026-10-14 14:05 ` [PATCH-next v3 3/9] cgroup/cpuset: Consider all the exclusive CPUs when doing housekeeping check Waiman Long
2026-10-16 2:18 ` Guopeng Zhang
2026-10-14 14:05 ` [PATCH-next v3 4/9] cgroup/cpuset: Do housekeeping check before converting invalid partition to valid Waiman Long
2026-10-16 2:21 ` Guopeng Zhang
2026-10-14 14:05 ` [PATCH-next v3 5/9] cgroup/cpuset: Properly disabling partition when partition state switching fails Waiman Long
2026-10-16 2:22 ` Guopeng Zhang
2026-10-14 14:05 ` [PATCH-next v3 6/9] cgroup/cpuset: Don't allow a child root partition under an isolated parent Waiman Long
2026-10-16 3:30 ` Guopeng Zhang [this message]
2026-10-14 14:05 ` [PATCH-next v3 7/9] selftests/cgroup: Add tests for isolcpus housekeeping check Waiman Long
2026-10-16 3:32 ` Guopeng Zhang
2026-10-14 14:05 ` [PATCH-next v3 8/9] selftests/cgroup: Add tests for nohz_full " Waiman Long
2026-10-14 14:05 ` [PATCH-next v3 9/9] selftests/cgroup: Skip test_cpuset_prs.sh test if some required CPUs are offline Waiman Long
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=497db854-17ba-47ae-a9e0-8f1dacb0b205@linux.dev \
--to=guopeng.zhang@linux.dev \
--cc=benquike@gmail.com \
--cc=cgroups@vger.kernel.org \
--cc=corbet@lwn.net \
--cc=hannes@cmpxchg.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=longman@redhat.com \
--cc=mkoutny@suse.com \
--cc=rdunlap@infradead.org \
--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.