FAILED: patch "[PATCH] cgroup/cpuset: Return PERR_NOCPUS in" failed to apply to 6.18-stable tree
Subsystems (4)
[email protected]
maintainerThe patch below does not apply to the 6.18-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.18.y
git checkout FETCH_HEAD
git cherry-pick -x 31c88350b7dd1522792f726f79607f31bb55c50f
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026092918-captive-docile-ef46@gregkh' --subject-prefix 'PATCH 6.18.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 31c88350b7dd1522792f726f79607f31bb55c50f Mon Sep 17 00:00:00 2001
From: Hui Peng <[email protected]>
Date: Thu, 24 Sep 2026 04:27:27 +0000
Subject: [PATCH] cgroup/cpuset: Return PERR_NOCPUS in
remote_partition_enable() on subpartitions_cpus conflict
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.
kernel/cgroup/cpuset.c +2 -1
@@ -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))
tools/testing/selftests/cgroup/test_cpuset_prs.sh +2 -0
@@ -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"
Sasha Levin
maintainerPATCH 1/3 cgroup/cpuset: Move up prstate_housekeeping_conflict() helper
From: Waiman Long <[email protected]>
[ Upstream commit 6cfeddbf4ade9202849d75c27c4d0c82b42c73d1 ]
Move up the prstate_housekeeping_conflict() helper so that it can be used in remote partition code.
Stable-dep-of: 31c88350b7dd ("cgroup/cpuset: Return PERR_NOCPUS in remote_partition_enable() on subpartitions_cpus conflict")
--- kernel/cgroup/cpuset.c | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-)
kernel/cgroup/cpuset.c +20 -20
@@ -1449,6 +1449,26 @@ static bool isolated_cpus_can_update(struct cpumask *add_cpus,return res; } +/* +* prstate_housekeeping_conflict - check for partition & housekeeping conflicts +* @prstate: partition root state to be checked +* @new_cpus: cpu mask +* Return: true if there is conflict, false otherwise +* +* CPUs outside of boot_hk_cpus, if defined, can only be used in an +* isolated partition. +*/ +static bool prstate_housekeeping_conflict (int prstate,struct cpumask *new_cpus) +{ +if (!have_boot_isolcpus) +return false; + +if ((prstate !=PRS_ISOLATED ) && !cpumask_subset (new_cpus, boot_hk_cpus)) +return true; + +return false; +} +static void update_isolation_cpumasks (bool isolcpus_updated) {int ret;
@@ -1751,26 +1771,6 @@ static void remote_cpus_update(struct cpuset *cs, struct cpumask *xcpus,remote_partition_disable (cs, tmp); } -/* -* prstate_housekeeping_conflict - check for partition & housekeeping conflicts -* @prstate: partition root state to be checked -* @new_cpus: cpu mask -* Return: true if there is conflict, false otherwise -* -* CPUs outside of boot_hk_cpus, if defined, can only be used in an -* isolated partition. -*/ -static bool prstate_housekeeping_conflict (int prstate,struct cpumask *new_cpus) -{ -if (!have_boot_isolcpus) -return false; - -if ((prstate !=PRS_ISOLATED ) && !cpumask_subset (new_cpus, boot_hk_cpus)) -return true; - -return false; -} -/** * update_parent_effective_cpumask - update effective_cpus mask of parent cpuset * @cs: The cpuset that requests change in partition root state
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/3 cgroup/cpuset: Ensure domain isolated CPUs stay in root or isolated partition
From: Waiman Long <[email protected]>
[ Upstream commit b1034a690129acd8995137bf4462470b4a2aa690 ]
Commit 4a74e418881f ("cgroup/cpuset: Check partition conflict with housekeeping setup") is supposed to ensure that domain isolated CPUs designated by the "isolcpus" boot command line option stay either in root partition or in isolated partitions. However, the required check wasn't implemented when a remote partition was created or when an existing partition changed type from "root" to "isolated".
Even though this is a relatively minor issue, we still need to add the required prstate_housekeeping_conflict() call in the right places to ensure that the rule is strictly followed.
The following steps can be used to reproduce the problem before this fix.
# fmt -1 /proc/cmdline | grep isolcpus isolcpus=9 # cd /sys/fs/cgroup/ # echo +cpuset > cgroup.subtree_control # mkdir test # echo 9 > test/cpuset.cpus # echo isolated > test/cpuset.cpus.partition # cat test/cpuset.cpus.partition isolated # cat test/cpuset.cpus.effective 9 # echo root > test/cpuset.cpus.partition # cat test/cpuset.cpus.effective 9 # cat test/cpuset.cpus.partition root
With this fix, the last few steps will become:
# echo root > test/cpuset.cpus.partition # cat test/cpuset.cpus.effective 0-8,10-95 # cat test/cpuset.cpus.partition root invalid (partition config conflicts with housekeeping setup)
Stable-dep-of: 31c88350b7dd ("cgroup/cpuset: Return PERR_NOCPUS in remote_partition_enable() on subpartitions_cpus conflict")
--- kernel/cgroup/cpuset.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
kernel/cgroup/cpuset.c +6 -4
@@ -1627,8 +1627,9 @@ static int remote_partition_enable(struct cpuset *cs, int new_prs,if (!cpumask_intersects (tmp->new_cpus, cpu_active_mask) ||cpumask_subset (top_cpuset.effective_cpus, tmp->new_cpus))return PERR_INVCPUS ; -if ((new_prs ==PRS_ISOLATED ) && - !isolated_cpus_can_update (tmp->new_cpus,NULL )) +if (((new_prs ==PRS_ISOLATED ) && + !isolated_cpus_can_update (tmp->new_cpus,NULL )) || +prstate_housekeeping_conflict (new_prs, tmp->new_cpus))return PERR_HKEEPING ;spin_lock_irq (&callback_lock);
@@ -3109,8 +3110,9 @@ static int update_prstate(struct cpuset *cs, int new_prs)* A change in load balance state only, no change in cpumasks. * Need to update isolated_cpus. */ -if ((new_prs ==PRS_ISOLATED ) && - !isolated_cpus_can_update (cs->effective_xcpus,NULL )) +if (((new_prs ==PRS_ISOLATED ) && + !isolated_cpus_can_update (cs->effective_xcpus,NULL )) || +prstate_housekeeping_conflict (new_prs, cs->effective_xcpus)) err =PERR_HKEEPING ;else isolcpus_updated = true;
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 3/3 cgroup/cpuset: Return PERR_NOCPUS in remote_partition_enable() on subpartitions_cpus conflict
In reply to Sasha LevinFrom: Hui Peng <[email protected]>
[ Upstream commit 31c88350b7dd1522792f726f79607f31bb55c50f ]
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.
--- kernel/cgroup/cpuset.c | 3 ++- tools/testing/selftests/cgroup/test_cpuset_prs.sh | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-)
kernel/cgroup/cpuset.c +2 -1
@@ -1623,10 +1623,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))
tools/testing/selftests/cgroup/test_cpuset_prs.sh +2 -0
@@ -297,6 +297,8 @@ TEST_MATRIX=( " C0-4:X2-4:S+ C1-4:X2-4:S+: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:S+ C1-3:S+ 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"
Signature · 1 line
2.53.0