mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
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:


  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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®