]> www.infradead.org Git - users/hch/misc.git/commitdiff
cpuset: fix failure to enable isolated partition when containing isolcpus
authorChen Ridong <chenridong@huawei.com>
Fri, 19 Sep 2025 01:12:26 +0000 (01:12 +0000)
committerTejun Heo <tj@kernel.org>
Fri, 19 Sep 2025 16:40:59 +0000 (06:40 -1000)
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: 4a74e418881f ("cgroup/cpuset: Check partition conflict with housekeeping setup")
Signed-off-by: Chen Ridong <chenridong@huawei.com>
Reviewed-by: Waiman Long <longman@redhat.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
kernel/cgroup/cpuset.c

index 44231cb1d83fe8cc7b168e93f43f0096700bffae..2b7e2f17577eada0882bed636597206de84a15b2 100644 (file)
@@ -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