All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ridong Chen <ridong.chen@linux.dev>
To: "Hui Peng" <benquike@gmail.com>,
	"Waiman Long" <longman@redhat.com>,
	"Guopeng Zhang" <guopeng.zhang@linux.dev>,
	"Tejun Heo" <tj@kernel.org>,
	"Johannes Weiner" <hannes@cmpxchg.org>,
	"Michal Koutný" <mkoutny@suse.com>
Cc: Shuah Khan <shuah@kernel.org>,
	Chen Ridong <chenridong@huawei.com>,
	cgroups@vger.kernel.org, linux-kselftest@vger.kernel.org,
	linux-kernel@vger.kernel.org, stable@vger.kernel.org
Subject: Re: [PATCH v4 1/3] cgroup/cpuset: return PERR_NOCPUS in remote_partition_enable() on subpartitions_cpus conflict
Date: Mon, 28 Sep 2026 09:25:08 +0800	[thread overview]
Message-ID: <fb32d01a-2020-426f-9af4-cdc74d60f9c6@linux.dev> (raw)
In-Reply-To: <20260924042729.1908863-2-benquike@gmail.com>



On 9/24/2026 12:27 PM, Hui Peng wrote:
> When a remote partition is created underneath an existing local partition
> via a non-partition (PRS_MEMBER) intermediate cgroup, update_prstate() sees
> parent->partition_root_state == PRS_MEMBER and calls
> remote_partition_enable().
> 
> Commit 86888c7bd117 ("cgroup/cpuset: Add warnings to catch inconsistency
> in exclusive CPUs") replaced the cpumask_intersects(tmp->new_cpus,
> subpartitions_cpus) error check in remote_partition_enable() with
> WARN_ON_ONCE(). As a result, remote_partition_enable() emits a warning
> and proceeds to enable the remote partition on CPUs that are already
> owned by the ancestor local partition in subpartitions_cpus.
> 
> This can be reproduced on Linux 7.3.0-rc3 with:
> 
>    mkdir -p /tmp/cg1
>    mount -t cgroup2 none /tmp/cg1
>    echo "+cpuset" > /tmp/cg1/cgroup.subtree_control
> 
>    mkdir /tmp/cg1/A
>    echo 1 > /tmp/cg1/A/cpuset.cpus
>    echo 1 > /tmp/cg1/A/cpuset.cpus.exclusive
>    echo root > /tmp/cg1/A/cpuset.cpus.partition
>    echo "+cpuset" > /tmp/cg1/A/cgroup.subtree_control
> 
>    mkdir /tmp/cg1/A/B
>    echo 1 > /tmp/cg1/A/B/cpuset.cpus
>    echo 1 > /tmp/cg1/A/B/cpuset.cpus.exclusive
>    echo "+cpuset" > /tmp/cg1/A/B/cgroup.subtree_control
> 
>    mkdir /tmp/cg1/A/B/D
>    echo 1 > /tmp/cg1/A/B/D/cpuset.cpus
>    echo 1 > /tmp/cg1/A/B/D/cpuset.cpus.exclusive
>    echo root > /tmp/cg1/A/B/D/cpuset.cpus.partition
> 
> which triggers:
> 
>    WARNING: kernel/cgroup/cpuset.c:1594 at remote_partition_enable+0x1c1/0x300
> 
> and leaves both /tmp/cg1/A and /tmp/cg1/A/B/D as active root partitions
> claiming exclusive CPU 1.
> 
> Fix this by returning PERR_NOCPUS when tmp->new_cpus intersects
> subpartitions_cpus in remote_partition_enable(), matching the error code
> used by remote_cpus_update() for the same subpartitions_cpus conflict, and
> add a regression test case to
> tools/testing/selftests/cgroup/test_cpuset_prs.sh.
> 
> Tested in QEMU on Linux 7.3.0-rc3 using the reproducer above and
> tools/testing/selftests/cgroup/test_cpuset_prs.sh.
> 
> Fixes: 86888c7bd117 ("cgroup/cpuset: Add warnings to catch inconsistency in exclusive CPUs")
> Suggested-by: Guopeng Zhang <guopeng.zhang@linux.dev>
> Cc: stable@vger.kernel.org
> Assisted-by: LLM
> Signed-off-by: Hui Peng <benquike@gmail.com>
> ---
>   kernel/cgroup/cpuset.c                            | 3 ++-
>   tools/testing/selftests/cgroup/test_cpuset_prs.sh | 2 ++
>   2 files changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c
> index 2538faac9aba..7381fa8502e7 100644
> --- a/kernel/cgroup/cpuset.c
> +++ b/kernel/cgroup/cpuset.c
> @@ -1591,10 +1591,11 @@ static int remote_partition_enable(struct cpuset *cs, int new_prs,
>   	 * above it or remote partition root underneath it is not allowed.
>   	 */
>   	compute_excpus(cs, tmp->new_cpus);
> -	WARN_ON_ONCE(cpumask_intersects(tmp->new_cpus, subpartitions_cpus));
>   	if (!cpumask_intersects(tmp->new_cpus, cpu_active_mask) ||
>   	    cpumask_subset(top_cpuset.effective_cpus, tmp->new_cpus))
>   		return PERR_INVCPUS;
> +	if (cpumask_intersects(tmp->new_cpus, subpartitions_cpus))
> +		return PERR_NOCPUS;
>   	if (((new_prs == PRS_ISOLATED) &&
>   	     !isolated_cpus_can_update(tmp->new_cpus, NULL)) ||
>   	    prstate_housekeeping_conflict(new_prs, tmp->new_cpus))
> diff --git a/tools/testing/selftests/cgroup/test_cpuset_prs.sh b/tools/testing/selftests/cgroup/test_cpuset_prs.sh
> index 3f7e81709365..b732078bf319 100755
> --- a/tools/testing/selftests/cgroup/test_cpuset_prs.sh
> +++ b/tools/testing/selftests/cgroup/test_cpuset_prs.sh
> @@ -298,6 +298,8 @@ TEST_MATRIX=(
>   	" C0-4:X2-4 C1-4:X2-4:P2 C2-4:X4:P1 \
>   				   .      .      .      X1      .    0 A1:0-1|A2:2-4|A3:2-4 \
>   								       A1:P0|A2:P2|A3:P-1 2-4"
> +	" 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"
>   
>   	# Remote partition offline tests
>   	"   C0-3    C1-3  C2-3     .    X2-3   X2-3 X2-3:P2:O2=0 .   0 A1:0-1|A2:1|A3:3 A1:P0|A3:P2 2-3"

Reviewed-by: Ridong Chen <ridong.chen@linux.dev>
Thanks.
-- 
Best regards
Ridong


  parent reply	other threads:[~2026-09-28  1:25 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-24  4:27 [PATCH v4 0/3] cgroup/cpuset: fix exclusive CPU conflict checks for local and remote partitions Hui Peng
2026-09-24  4:27 ` [PATCH v4 1/3] cgroup/cpuset: return PERR_NOCPUS in remote_partition_enable() on subpartitions_cpus conflict Hui Peng
2026-09-25 19:22   ` Waiman Long
2026-09-26 19:11   ` Tejun Heo
2026-09-28  1:25   ` Ridong Chen [this message]
2026-09-24  4:27 ` [PATCH v4 2/3] cgroup/cpuset: prevent activating local partition over remote one Hui Peng
2026-09-27  1:45   ` Waiman Long
2026-09-28  1:40   ` Ridong Chen
2026-09-28 16:13     ` Waiman Long
2026-09-24  4:27 ` [PATCH v4 3/3] cgroup/cpuset: check sibling effective_xcpus in cpus_excl_conflict() Hui Peng
2026-09-27 23:44   ` Waiman Long
2026-09-28 17:30   ` 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=fb32d01a-2020-426f-9af4-cdc74d60f9c6@linux.dev \
    --to=ridong.chen@linux.dev \
    --cc=benquike@gmail.com \
    --cc=cgroups@vger.kernel.org \
    --cc=chenridong@huawei.com \
    --cc=guopeng.zhang@linux.dev \
    --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=shuah@kernel.org \
    --cc=stable@vger.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.