On 10/11/2026 6:19 AM, Waiman Long wrote:
When a hotplug event happens or when update_cpumasks_hier() is called, an
invalid partition may be converted back to valid. However check against
housekeeping conflict isn't being done which can lead to a partition
state that violates the housekeeping rules. Update the code to allow
reviving an invalid partition only if it can pass the housekeeping check.
Fixes: 4a74e418881f ("cgroup/cpuset: Check partition conflict with housekeeping
setup")
Signed-off-by: Waiman Long <[email protected]>
---
kernel/cgroup/cpuset.c | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c
index 1c0441fa3bea..fb41cd76add6 100644
--- a/kernel/cgroup/cpuset.c
+++ b/kernel/cgroup/cpuset.c
@@ -1374,6 +1374,13 @@ static bool prstate_housekeeping_conflict(int new_prs,
int parent_prs,
cpumask_var_t full_hk_cpus;
int res;
+ /*
+ * For a currently invalid partition state, do the check assuming that
+ * it may be converted back to valid.
+ */
+ if (new_prs < 0)
+ new_prs = -new_prs;
+
Personally, I don't like this. I think it should be certain what new_prs really
is when prstate_housekeeping_conflict() is called; otherwise, it makes the code
unreadable.
So I think when new_prs < 0, we should return false.
if (housekeeping_enabled(HK_TYPE_DOMAIN_BOOT) && (new_prs == PRS_ROOT)
&&
!cpumask_subset(add_cpus,
housekeeping_cpumask(HK_TYPE_DOMAIN_BOOT)))
return true;
@@ -1956,9 +1963,16 @@ static int update_parent_effective_cpumask(struct cpuset
*cs, int cmd,
bool exclusive = true;
/*
- * Convert invalid partition to valid has to
- * pass the cpu exclusivity test.
+ * Convert invalid partition to valid has to pass the
+ * cpu exclusivity test as well as the housekeeping
+ * check.
*/
+ if
(prstate_housekeeping_conflict(cs->partition_root_state,
+
parent->partition_root_state,
+ xcpus, NULL)) {
+ part_error = PERR_HKEEPING;
+ goto write_error;
+ }
rcu_read_lock();
cpuset_for_each_child(child, css, parent) {
if (child == cs)
--
Best regards
Ridong