From: Chen Ridong <chenridong@huawei.com>
The 'isolcpus' parameter specified at boot time can be assigned to an
isolated partition. While it is valid put the 'isolcpus' in an isolated
partition, attempting to change a member cpuset to an isolated partition
will fail if the cpuset contains any 'isolcpus'.
For example, the system boots with 'isolcpus=9', and the following
configuration works correctly:
# cd /sys/fs/cgroup/
# mkdir test
# echo 1 > test/cpuset.cpus
# echo isolated > test/cpuset.cpus.partition
# cat test/cpuset.cpus.partition
isolated
# echo 9 > test/cpuset.cpus
# cat test/cpuset.cpus.partition
isolated
# cat test/cpuset.cpus
9
However, the following steps to convert a member cpuset to an isolated
partition will fail:
# cd /sys/fs/cgroup/
# mkdir test
# echo 9 > test/cpuset.cpus
# echo isolated > test/cpuset.cpus.partition
# cat test/cpuset.cpus.partition
isolated invalid (partition config conflicts with housekeeping setup)
The issue occurs because the new partition state (new_prs) is used for
validation against housekeeping constraints before it has been properly
updated. To resolve this, move the assignment of new_prs before the
housekeeping validation check when enabling a root partition.
Fixes: 11e5f407b64a ("cgroup/cpuset: Keep track of CPUs in isolated partitions")
Signed-off-by: Chen Ridong <chenridong@huawei.com>
---
kernel/cgroup/cpuset.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c
index 44231cb1d83f..2b7e2f17577e 100644
--- a/kernel/cgroup/cpuset.c
+++ b/kernel/cgroup/cpuset.c
@@ -1806,6 +1806,7 @@ static int update_parent_effective_cpumask(struct cpuset *cs, int cmd,
xcpus = tmp->delmask;
if (compute_excpus(cs, xcpus))
WARN_ON_ONCE(!cpumask_empty(cs->exclusive_cpus));
+ new_prs = (cmd == partcmd_enable) ? PRS_ROOT : PRS_ISOLATED;
/*
* Enabling partition root is not allowed if its
@@ -1838,7 +1839,6 @@ static int update_parent_effective_cpumask(struct cpuset *cs, int cmd,
deleting = true;
subparts_delta++;
- new_prs = (cmd == partcmd_enable) ? PRS_ROOT : PRS_ISOLATED;
} else if (cmd == partcmd_disable) {
/*
* May need to add cpus back to parent's effective_cpus
--
2.34.1
On 9/18/25 8:25 AM, Chen Ridong wrote: > From: Chen Ridong <chenridong@huawei.com> > > The 'isolcpus' parameter specified at boot time can be assigned to an > isolated partition. While it is valid put the 'isolcpus' in an isolated > partition, attempting to change a member cpuset to an isolated partition > will fail if the cpuset contains any 'isolcpus'. > > For example, the system boots with 'isolcpus=9', and the following > configuration works correctly: > > # cd /sys/fs/cgroup/ > # mkdir test > # echo 1 > test/cpuset.cpus > # echo isolated > test/cpuset.cpus.partition > # cat test/cpuset.cpus.partition > isolated > # echo 9 > test/cpuset.cpus > # cat test/cpuset.cpus.partition > isolated > # cat test/cpuset.cpus > 9 > > However, the following steps to convert a member cpuset to an isolated > partition will fail: > > # cd /sys/fs/cgroup/ > # mkdir test > # echo 9 > test/cpuset.cpus > # echo isolated > test/cpuset.cpus.partition > # cat test/cpuset.cpus.partition > isolated invalid (partition config conflicts with housekeeping setup) > > The issue occurs because the new partition state (new_prs) is used for > validation against housekeeping constraints before it has been properly > updated. To resolve this, move the assignment of new_prs before the > housekeeping validation check when enabling a root partition. > > Fixes: 11e5f407b64a ("cgroup/cpuset: Keep track of CPUs in isolated partitions") > Signed-off-by: Chen Ridong <chenridong@huawei.com> Thanks for finding the bug. However, I think the commit to be fixed should be 4a74e418881f ("cgroup/cpuset: Check partition conflict with housekeeping setup"), not the one you listed above. Cheers, Longman > --- > kernel/cgroup/cpuset.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c > index 44231cb1d83f..2b7e2f17577e 100644 > --- a/kernel/cgroup/cpuset.c > +++ b/kernel/cgroup/cpuset.c > @@ -1806,6 +1806,7 @@ static int update_parent_effective_cpumask(struct cpuset *cs, int cmd, > xcpus = tmp->delmask; > if (compute_excpus(cs, xcpus)) > WARN_ON_ONCE(!cpumask_empty(cs->exclusive_cpus)); > + new_prs = (cmd == partcmd_enable) ? PRS_ROOT : PRS_ISOLATED; > > /* > * Enabling partition root is not allowed if its > @@ -1838,7 +1839,6 @@ static int update_parent_effective_cpumask(struct cpuset *cs, int cmd, > > deleting = true; > subparts_delta++; > - new_prs = (cmd == partcmd_enable) ? PRS_ROOT : PRS_ISOLATED; > } else if (cmd == partcmd_disable) { > /* > * May need to add cpus back to parent's effective_cpus
On 2025/9/19 2:02, Waiman Long wrote: > On 9/18/25 8:25 AM, Chen Ridong wrote: >> From: Chen Ridong <chenridong@huawei.com> >> >> The 'isolcpus' parameter specified at boot time can be assigned to an >> isolated partition. While it is valid put the 'isolcpus' in an isolated >> partition, attempting to change a member cpuset to an isolated partition >> will fail if the cpuset contains any 'isolcpus'. >> >> For example, the system boots with 'isolcpus=9', and the following >> configuration works correctly: >> >> # cd /sys/fs/cgroup/ >> # mkdir test >> # echo 1 > test/cpuset.cpus >> # echo isolated > test/cpuset.cpus.partition >> # cat test/cpuset.cpus.partition >> isolated >> # echo 9 > test/cpuset.cpus >> # cat test/cpuset.cpus.partition >> isolated >> # cat test/cpuset.cpus >> 9 >> >> However, the following steps to convert a member cpuset to an isolated >> partition will fail: >> >> # cd /sys/fs/cgroup/ >> # mkdir test >> # echo 9 > test/cpuset.cpus >> # echo isolated > test/cpuset.cpus.partition >> # cat test/cpuset.cpus.partition >> isolated invalid (partition config conflicts with housekeeping setup) >> >> The issue occurs because the new partition state (new_prs) is used for >> validation against housekeeping constraints before it has been properly >> updated. To resolve this, move the assignment of new_prs before the >> housekeeping validation check when enabling a root partition. >> >> Fixes: 11e5f407b64a ("cgroup/cpuset: Keep track of CPUs in isolated partitions") >> Signed-off-by: Chen Ridong <chenridong@huawei.com> > > Thanks for finding the bug. However, I think the commit to be fixed should be 4a74e418881f > ("cgroup/cpuset: Check partition conflict with housekeeping setup"), not the one you listed above. > Thank you for the correction, Longman, you are right. I'll update the commit ID with the correct one -- Best regards, Ridong
© 2016 - 2025 Red Hat, Inc.