All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v5 00/12] cpuset: rework local partition logic
@ 2026-11-14  8:31 Ridong Chen
  2026-11-14  8:31 ` [PATCH v5 01/12] cpuset: introduce partition_enable() Ridong Chen
                   ` (11 more replies)
  0 siblings, 12 replies; 13+ messages in thread
From: Ridong Chen @ 2026-11-14  8:31 UTC (permalink / raw)
  To: Waiman Long, Tejun Heo, Johannes Weiner, Michal Koutný
  Cc: Ridong Chen, Guopeng Zhang, cgroups, linux-kernel, Ridong Chen

From: Ridong Chen <chenridong@xiaomi.com>

This is v5 of the cpuset local partition rework [1], which I started
while at Huawei and am now continuing at Xiaomi. Since v4, the fixes and
preparatory changes at the start of the series have been posted
separately, last as [2], and merged into cgroup/for-7.4-fixes. This
version is based on it and only has the part that consolidates the
partition state changes into common helpers, the remaining parts will
follow.

The partition state of a cpuset is currently changed in many places, and
local and remote partitions are handled by different code.
update_parent_effective_cpumask() alone handles five partcmd_* commands
for local partitions, while the remote partition helpers open code the
same updates of partition_root_state, prs_err, effective_xcpus,
subpartitions_cpus and isolated_cpus.

The idea is to have one set of common helpers to enable, disable and
update a partition. Local and remote partitions only do their own
validation and then call these helpers, and all partition related
state is set or changed only inside them. After this series:

     update_prstate()        update_cpumask()
     update_cpumasks_hier()  cpuset_hotplug_update_tasks()
                          |
          +---------------+---------------+
          |                               |
          v                               v
  +-------------------+         +--------------------+
  |  local partition  |         |  remote partition  |
  |                   |         |                    |
  | validate_local_   |         | remote_partition_  |
  |     partition()   |         |     enable()       |
  | local_partition_  |         | remote_cpus_       |
  |     enable()      |         |     update()       |
  |     update()      |         |                    |
  +-------------------+         +--------------------+
          |                               |
          +---------------+---------------+
                          |
                          v
  +------------------------------------------------+
  |  partition_enable()                            |
  |  partition_disable()                           |
  |  partition_update()                            |
  +------------------------------------------------+
                          |
                          |  partition state, only changed here
                          v
  +------------------------------------------------+
  |  cpuset:  partition_root_state, prs_err,       |
  |           remote_partition, effective_xcpus,   |
  |           exclusive_cpus                       |
  |  global:  subpartitions_cpus, isolated_cpus    |
  +------------------------------------------------+

  partition_enable()  - make a cpuset a valid partition root, or switch
                        a valid partition between root and isolated
  partition_disable() - make a partition a member or invalid, give its
                        CPUs back to the parent and propagate the change
  partition_update()  - update the exclusive CPUs of a valid partition

A partition is disabled with partition_disable() directly, for both
local and remote partitions, as giving the CPUs back to the parent needs
no partition specific handling.

With this, every caller follows the same pattern (validate, then
enable/disable/update), and it is much easier to see where and why a
partition state changes.

Patches 1-3 introduce the common helpers and patches 4-6 use them for
remote partitions. Patches 7-11 add validate_local_partition(),
local_partition_enable() and local_partition_update() and convert the
local partition paths, including the hotplug path, to them. Patch 12
removes update_parent_effective_cpumask() and the partition_cmd enum.

The series is meant to be functionally equivalent, except that the
failure reason of an invalid partition is kept more accurately. For
example, PERR_CPUSEMPTY of a partition with empty cpuset.cpus and
cpuset.cpus.exclusive is no longer overwritten by PERR_INVCPUS when its
parent changes.

The remaining parts of the rework, e.g. validate_remote_partition(),
removing the partition field updates left outside the helpers and
simplifying update_prstate(), will be posted as a follow-up series.

test_cpuset_prs.sh passes with this series applied, with no boot option,
with isolcpus=10-11 and with nohz_full=8-11. Patches 10-12, which change
the hotplug path in between, are also tested individually.

Changes in v5:
  - Drop the RFC tag and rebase onto cgroup/for-7.4-fixes, which has
    patches 1-3 of v4 merged [2]. Only post patches 4-14 of v4.
  - Call partition_disable() directly, instead of local_ and
    remote_partition_disable().
  - Add validate_local_partition() in a separate patch.
  - Keep PERR_CPUSEMPTY for empty cpumasks (Sashiko).
  - Add __maybe_unused to unused helpers (Guopeng).
  - Link to v4: https://lore.kernel.org/all/20261101114206.2434398-1-ridong.chen@linux.dev/

[1] https://lore.kernel.org/all/20261101114206.2434398-1-ridong.chen@linux.dev/
[2] https://lore.kernel.org/all/20261112031931.2815548-1-ridong.chen@linux.dev/

Ridong Chen (12):
  cpuset: introduce partition_enable()
  cpuset: introduce partition_disable()
  cpuset: introduce partition_update()
  cpuset: use partition_enable() for remote partition enablement
  cpuset: use partition_disable() for remote partition disablement
  cpuset: use partition_update() for remote partition update
  cpuset: introduce validate_local_partition()
  cpuset: introduce local_partition_enable()
  cpuset: use partition_disable() for local partition disablement
  cpuset: use partition_disable() to invalidate local partition
  cpuset: introduce local_partition_update()
  cpuset: remove update_parent_effective_cpumask

 kernel/cgroup/cpuset.c | 856 +++++++++++++++++++----------------------
 1 file changed, 398 insertions(+), 458 deletions(-)


base-commit: e234ed1bb82c96a5643fd70784f16cf3d72eeed3
-- 
2.34.1


^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2026-11-14  8:32 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-11-14  8:31 [PATCH v5 00/12] cpuset: rework local partition logic Ridong Chen
2026-11-14  8:31 ` [PATCH v5 01/12] cpuset: introduce partition_enable() Ridong Chen
2026-11-14  8:31 ` [PATCH v5 02/12] cpuset: introduce partition_disable() Ridong Chen
2026-11-14  8:31 ` [PATCH v5 03/12] cpuset: introduce partition_update() Ridong Chen
2026-11-14  8:31 ` [PATCH v5 04/12] cpuset: use partition_enable() for remote partition enablement Ridong Chen
2026-11-14  8:31 ` [PATCH v5 05/12] cpuset: use partition_disable() for remote partition disablement Ridong Chen
2026-11-14  8:31 ` [PATCH v5 06/12] cpuset: use partition_update() for remote partition update Ridong Chen
2026-11-14  8:31 ` [PATCH v5 07/12] cpuset: introduce validate_local_partition() Ridong Chen
2026-11-14  8:31 ` [PATCH v5 08/12] cpuset: introduce local_partition_enable() Ridong Chen
2026-11-14  8:31 ` [PATCH v5 09/12] cpuset: use partition_disable() for local partition disablement Ridong Chen
2026-11-14  8:31 ` [PATCH v5 10/12] cpuset: use partition_disable() to invalidate local partition Ridong Chen
2026-11-14  8:31 ` [PATCH v5 11/12] cpuset: introduce local_partition_update() Ridong Chen
2026-11-14  8:31 ` [PATCH v5 12/12] cpuset: remove update_parent_effective_cpumask Ridong Chen

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.