From: Mitchell Levy <levymitchell0@gmail.com>
To: "Miguel Ojeda" <ojeda@kernel.org>,
"Alex Gaynor" <alex.gaynor@gmail.com>,
"Boqun Feng" <boqun.feng@gmail.com>,
"Gary Guo" <gary@garyguo.net>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Andreas Hindborg" <a.hindborg@kernel.org>,
"Alice Ryhl" <aliceryhl@google.com>,
"Trevor Gross" <tmgross@umich.edu>,
"Andrew Morton" <akpm@linux-foundation.org>,
"Dennis Zhou" <dennis@kernel.org>, "Tejun Heo" <tj@kernel.org>,
"Christoph Lameter" <cl@linux.com>,
"Danilo Krummrich" <dakr@kernel.org>,
"Benno Lossin" <lossin@kernel.org>,
"Yury Norov" <yury.norov@gmail.com>,
"Viresh Kumar" <viresh.kumar@linaro.org>
Cc: Tyler Hicks <code@tyhicks.com>,
Allen Pais <apais@linux.microsoft.com>,
linux-kernel@vger.kernel.org, rust-for-linux@vger.kernel.org,
linux-mm@kvack.org, Mitchell Levy <levymitchell0@gmail.com>
Subject: [PATCH v4 0/9] rust: Add Per-CPU Variable API
Date: Wed, 05 Nov 2025 15:01:12 -0800 [thread overview]
Message-ID: <20251105-rust-percpu-v4-0-984b1470adcb@gmail.com> (raw)
This series adds an API for declaring and using per-CPU variables from
Rust, and it also adds support for Rust access to C per-CPU variables
(subject to some soundness requirements). It also adds a small sample
module, samples/rust/rust_percpu.rs, in the vein of lib/percpu_test.c.
---
Signed-off-by: Mitchell Levy <levymitchell0@gmail.com>
---
Changes in v4:
- Split what was the first patch into three patches (Thanks Yury Norov)
- Add intra-doc links to rustdoc comments (Thanks Miguel Ojeda)
- `get_remote_ptr` is no longer unsafe (Thanks Miguel Ojeda)
- Renamed the CPU mask getters to be more clear (Thanks Yury Norov)
- Add an `ExternStaticPerCpuSymbol` type for static per-CPU variables
shared with C in order to make the extra soundness requirements for
these variables more explicit.
- Properly drop the contents of dynamically allocated per-CPUs when the
`DynamicPerCpu` is dropped, and properly document that
`PerCpuAllocation` does not handle dropping values in the allocation.
- Functions on the numeric token types are now `#[inline]`
- Safety requirements of `PerCpuPtr` functions now include the fact that
the pointed-to allocation must be live and appropriately laid out in
memory, and SAFETY comments of uses of these functions have been
updated to reflect these requirements.
- Included the cpumask patches first, since it might make sense for
these to be merged separately.
- Documentation improvements throughout.
- Link to v3: https://lore.kernel.org/r/20250828-rust-percpu-v3-0-4dd92e1e7904@gmail.com
Changes in v3:
- Add a `CheckedPerCpuToken` that enables usage of per-CPU variables via
a `&T`, allowing for a wholly safe interface when `T` allows for
interior mutability (Thanks Benno Lossin)
- Add support for non-zeroable types to be used in a `DynamicPerCpu`.
- Remove necessity for `unsafe` to get a `StaticPerCpu` from its
declaration (Thanks Benno Lossin)
- Allow the declaration of static per-CPU variables of types that are
`!Sync`.
- Implement `PerCpuPtr` in terms of `MaybeUninit<T>` rather than `T` so
as to keep all invariants in the `DynamicPerCpu` and `StaticPerCpu`
types --- this would also enable `PerCpuPtr` to be used in a per-CPU
type that does lazy initialization.
- Link to v2: https://lore.kernel.org/r/20250712-rust-percpu-v2-0-826f2567521b@gmail.com
Changes in v2:
- Fix kernel test robot issues
- Fix documentation error
- Require `T: Zeroable` in the dynamic case
- Link to v1: https://lore.kernel.org/r/20250624-rust-percpu-v1-0-9c59b07d2a9c@gmail.com
Changes in v1:
- Use wrapping_add in `PerCpuPtr::get_ref` since overflow is expected.
- Separate the dynamic and static cases, with shared logic in a
`PerCpuPtr` type.
- Implement pin-hole optimizations for numeric types
- Don't assume `GFP_KERNEL` when allocating the `Arc` in the dynamic
case.
- Link to RFC v2: https://lore.kernel.org/r/20250414-rust-percpu-v2-0-5ea0d0de13a5@gmail.com
Changes in RFC v2:
- Renamed PerCpuVariable to StaticPerCpuSymbol to be more descriptive
- Support dynamically allocated per-CPU variables via the
PerCpuAllocation type. Rework statically allocated variables to use
this new type.
- Make use of a token/closure-based API via the PerCpu and PerCpuToken
types, rather than an API based on PerCpuRef that automatically
Deref(Mut)'s into a &(mut) T.
- Rebased
- Link to RFC: https://lore.kernel.org/r/20241219-rust-percpu-v1-0-209117e822b1@gmail.com
---
Mitchell Levy (9):
rust: cpumask: Add a `Cpumask` iterator
rust: cpumask: Add getters for globally defined cpumasks
rust: percpu: Add C bindings for per-CPU variable API
rust: percpu: introduce a rust API for static per-CPU variables
rust: percpu: introduce a rust API for dynamic per-CPU variables
rust: percpu: add a rust per-CPU variable sample
rust: percpu: Support non-zeroable types for DynamicPerCpu
rust: percpu: Add pin-hole optimizations for numerics
rust: percpu: cache per-CPU pointers in the dynamic case
rust/helpers/cpumask.c | 5 +
rust/helpers/helpers.c | 2 +
rust/helpers/percpu.c | 20 +++
rust/helpers/preempt.c | 14 ++
rust/kernel/cpumask.rs | 94 ++++++++++++-
rust/kernel/lib.rs | 3 +
rust/kernel/percpu.rs | 273 +++++++++++++++++++++++++++++++++++++
rust/kernel/percpu/cpu_guard.rs | 36 +++++
rust/kernel/percpu/dynamic.rs | 184 +++++++++++++++++++++++++
rust/kernel/percpu/numeric.rs | 138 +++++++++++++++++++
rust/kernel/percpu/static_.rs | 218 +++++++++++++++++++++++++++++
samples/rust/Kconfig | 9 ++
samples/rust/Makefile | 1 +
samples/rust/rust_percpu.rs | 294 ++++++++++++++++++++++++++++++++++++++++
14 files changed, 1290 insertions(+), 1 deletion(-)
---
base-commit: f3f6b3664302e16ef1c6b91034a72df5564d6b8a
change-id: 20240813-rust-percpu-ea2f54b5da33
Best regards,
--
Mitchell Levy <levymitchell0@gmail.com>
next reply other threads:[~2025-11-05 23:02 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-05 23:01 Mitchell Levy [this message]
2025-11-05 23:01 ` [PATCH v4 1/9] rust: cpumask: Add a `Cpumask` iterator Mitchell Levy
2025-11-07 0:25 ` Yury Norov
2025-11-08 0:06 ` Mitchell Levy
2025-11-08 3:39 ` Yury Norov
2025-11-05 23:01 ` [PATCH v4 2/9] rust: cpumask: Add getters for globally defined cpumasks Mitchell Levy
2025-11-07 0:53 ` Yury Norov
2025-11-08 0:27 ` Mitchell Levy
2025-11-05 23:01 ` [PATCH v4 3/9] rust: percpu: Add C bindings for per-CPU variable API Mitchell Levy
2025-11-07 0:57 ` Yury Norov
2025-11-05 23:01 ` [PATCH v4 4/9] rust: percpu: introduce a rust API for static per-CPU variables Mitchell Levy
2025-11-14 14:48 ` Andreas Hindborg
2025-11-05 23:01 ` [PATCH v4 5/9] rust: percpu: introduce a rust API for dynamic " Mitchell Levy
2025-11-14 15:24 ` Andreas Hindborg
2025-11-05 23:01 ` [PATCH v4 6/9] rust: percpu: add a rust per-CPU variable sample Mitchell Levy
2025-11-05 23:01 ` [PATCH v4 7/9] rust: percpu: Support non-zeroable types for DynamicPerCpu Mitchell Levy
2025-11-14 15:18 ` Andreas Hindborg
2025-11-05 23:01 ` [PATCH v4 8/9] rust: percpu: Add pin-hole optimizations for numerics Mitchell Levy
2025-11-05 23:01 ` [PATCH v4 9/9] rust: percpu: cache per-CPU pointers in the dynamic case Mitchell Levy
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=20251105-rust-percpu-v4-0-984b1470adcb@gmail.com \
--to=levymitchell0@gmail.com \
--cc=a.hindborg@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=alex.gaynor@gmail.com \
--cc=aliceryhl@google.com \
--cc=apais@linux.microsoft.com \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun.feng@gmail.com \
--cc=cl@linux.com \
--cc=code@tyhicks.com \
--cc=dakr@kernel.org \
--cc=dennis@kernel.org \
--cc=gary@garyguo.net \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=lossin@kernel.org \
--cc=ojeda@kernel.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=tj@kernel.org \
--cc=tmgross@umich.edu \
--cc=viresh.kumar@linaro.org \
--cc=yury.norov@gmail.com \
/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.