Several partition type-change and validation paths use effective_xcpus, which also includes CPUs assigned to valid child partitions. As a result, changing a parent between root and isolated can alter a child's isolation accounting or fail housekeeping validation because of CPUs the parent does not own.
A proposed parent CPU mask needs different treatment for children which would become invalid under that mask. Their CPUs return to the parent and must participate in housekeeping validation. Otherwise a parent can pass validation with a boot-isolated CPU hidden behind a child which is about to become invalid. There are two related failure paths. Returning the last housekeeping CPU from a root child to an isolated parent must invalidate the appropriate isolated ancestor. Also, a root/isolated type change which fails housekeeping validation must release the partition's CPUs instead of leaving them unavailable to the owner of the invalidated subtree. Factor out the child partition validity checks and reuse them when computing the CPUs owned directly by a partition under a proposed configuration. Use the directly owned CPUs for root/isolated type-change accounting and housekeeping validation, handle the last-housekeeping-CPU return case, and run the normal partition-disable path after a failed type-change validation. Add focused selftests for each case. This is based on cgroup/for-7.3-fixes (3f4b7d1a49c5 "selftests/cgroup: test clone3() into a previously killed cgroup"). Testing: - Ran tools/testing/selftests/cgroup/test_cpuset_prs.sh with isolcpus=domain,15; all applicable tests passed. - Ran the housekeeping CPU-return tests with nohz_full=1-14 isolcpus=domain,15; both cases passed. Changes in v3: - factor the child partition validity rules into a preparatory patch and reuse them for trial ownership calculation; - during trial validation, subtract only children which remain valid under the proposed parent CPU mask, covering both PERR_INVCPUS and PERR_NOCPUS; - keep cs->effective_xcpus as the default isolation-accounting mask and use the directly owned mask only for a successful root/isolated type change; - use an isolated child for the boot-isolated trial-validation tests, as a root child containing that CPU fails immediately with PERR_HKEEPING; - make the isolated-ancestor walk safe when it reaches the top cpuset and clarify the member-transition handling; - clean up nested housekeeping-return test cgroups on failure. Link: https://lore.kernel.org/all/[email protected]/ Changes in v2: - split the type-transition fixes from the original series; - merge the child-owned accounting and validation changes; - validate trial CPU masks against CPUs owned directly by the partition; - handle a root child returning the last housekeeping CPU, including nested isolated ancestors; - use the common partition-disable path after type-change validation failure; - initialize boot-isolated CPU data during selftest setup; - split the accounting, child-owned validation and housekeeping-return tests. Link: https://lore.kernel.org/all/[email protected]/ Guopeng Zhang (7): cgroup/cpuset: Factor out child partition validation cgroup/cpuset: Account for child CPU ownership in partition changes selftests/cgroup: Add tests for type-change isolation accounting selftests/cgroup: Test child CPU ownership in partition changes selftests/cgroup: Add tests for housekeeping CPU return to isolated parents cgroup/cpuset: Release CPUs when type-change validation fails selftests/cgroup: Add CPU release tests for type-change validation failures kernel/cgroup/cpuset.c | 182 +++++++- .../selftests/cgroup/test_cpuset_prs.sh | 430 +++++++++++++++++- 2 files changed, 588 insertions(+), 24 deletions(-) base-commit: 3f4b7d1a49c5c826f3be9b684313eea5b83ac232 -- 2.43.0

