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


Reply via email to