Re: [PATCH v2 4/4] cpuset: generalize the validate_partition() interface

From: Ridong Chen

Date: Sat Nov 07 2026 - 06:20:15 EST




On 11/7/2026 11:59 AM, Waiman Long wrote:
On 11/6/26 5:55 AM, Ridong Chen wrote:
From: Chen Ridong <chenridong@xxxxxxxxxx>

Refactor validate_partition() to take the parent partition, the new
partition root state, the new effective exclusive CPUs and the CPUs to
be deleted, instead of a trial cpuset. A NULL parent stands for a
remote partition, whose CPUs come from top_cpuset. This makes the
interface flexible enough to handle both local and remote partition
validation.

The housekeeping conflict check is folded into validate_partition(). It
is skipped when the parent is not a valid partition root, as @cs can't
be a valid local partition in that case.

Use the new interface for local partition enablement in
update_parent_effective_cpumask() and in partition_cpus_change(),
replacing the open-coded checks there. The order of the checks is now
the same for both paths: empty CPUs, housekeeping conflict, then no CPU
left for tasks.

Signed-off-by: Chen Ridong <chenridong@xxxxxxxxxx>
Signed-off-by: Ridong Chen <chenridong@xxxxxxxxxx>
---
  kernel/cgroup/cpuset.c | 112 +++++++++++++++++++----------------------
  1 file changed, 52 insertions(+), 60 deletions(-)

diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c
index a5ab9396eb61..1b0ac4e76ec7 100644
--- a/kernel/cgroup/cpuset.c
+++ b/kernel/cgroup/cpuset.c
@@ -1434,6 +1434,41 @@ static bool prstate_housekeeping_conflict(int new_prs, int parent_prs,
      return res;
  }
+/**
+ * validate_partition - Validate a cpuset partition configuration
+ * @cs: The cpuset to validate
+ * @parent: Parent partition of @cs, NULL for remote partition
+ * @new_prs: The proposed new partition root state
+ * @new_excpus: The new effective exclusive CPUs mask to validate
+ * @del: exclusive CPUs to be deleted from @cs, can be NULL
+ *
+ * The housekeeping check is skipped if @parent is not a valid partition
+ * root as @cs can't be a valid local partition in that case.
+ *
+ * Return: PRS error code (0 if valid, non-zero error code if invalid)
+ */
+static enum prs_errcode validate_partition(struct cpuset *cs,
+        struct cpuset *parent, int new_prs,
+        struct cpumask *new_excpus, struct cpumask *del)
+{
+    int parent_prs = parent ? parent->partition_root_state : PRS_ROOT;
+
+    if (new_prs == PRS_MEMBER)
+        return PERR_NONE;
+
+    if (cpumask_empty(new_excpus))
+        return PERR_INVCPUS;
+
+    if ((parent_prs > 0) &&
+        prstate_housekeeping_conflict(new_prs, parent_prs, new_excpus, del))
+        return PERR_HKEEPING;
+
+    if (tasks_nocpu_error(parent_cs(cs), cs, new_excpus))
+        return PERR_NOCPUS;

For remote partition, the parent should be top_cpuset. I think we should set parent to top_cpuset if NULL and pass it directly to tasks_nocpu_error().


Good catch, thanks. parent_cs(cs) is wrong for a remote partition, since
its CPUs come from top_cpuset rather than its cgroup parent. I'll set
parent to &top_cpuset when it's NULL and pass it to tasks_nocpu_error():

if (!parent)
parent = &top_cpuset;
parent_prs = parent->partition_root_state;
if (parent_prs > 0 &&
prstate_housekeeping_conflict(new_prs, parent_prs, new_excpus, del))
return PERR_HKEEPING;

if (tasks_nocpu_error(parent, cs, new_excpus))
return PERR_NOCPUS;

Other than that, the rests look good to me.


Thanks for the review. Will fix it in v3.

--
Best regards
Ridong