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
next 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 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.