The Linux Kernel Mailing List
 help / color / mirror / Atom feed
From: Ridong Chen <ridong.chen@linux.dev>
To: "Waiman Long" <longman@redhat.com>, "Tejun Heo" <tj@kernel.org>,
	"Johannes Weiner" <hannes@cmpxchg.org>,
	"Michal Koutný" <mkoutny@suse.com>
Cc: Ridong Chen <ridong.chen@linux.dev>,
	Guopeng Zhang <zhangguopeng@kylinos.cn>,
	cgroups@vger.kernel.org, linux-kernel@vger.kernel.org,
	Ridong Chen <chenridong@xiaomi.com>
Subject: [PATCH v5 00/12] cpuset: rework local partition logic
Date: Sat, 14 Nov 2026 16:31:12 +0800	[thread overview]
Message-ID: <20261114083124.1340140-1-ridong.chen@linux.dev> (raw)

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


             reply	other threads:[~2026-11-14  8:31 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-14  8:31 Ridong Chen [this message]
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20261114083124.1340140-1-ridong.chen@linux.dev \
    --to=ridong.chen@linux.dev \
    --cc=cgroups@vger.kernel.org \
    --cc=chenridong@xiaomi.com \
    --cc=hannes@cmpxchg.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=longman@redhat.com \
    --cc=mkoutny@suse.com \
    --cc=tj@kernel.org \
    --cc=zhangguopeng@kylinos.cn \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox