rust: Add Per-CPU Variable API
Get series with b4
b4 am [email protected] change-id 20240813-rust-percpu-ea2f54b5da33Versions newest first
- v5 Latest8 patches 3 repliesIn review
- v49 patches 9 repliesSuperseded
- v37 patches 18 repliesSuperseded
Earlier versions · 4
| Version | Posted | Patches | Replies | Status |
|---|---|---|---|---|
| v2 posting 2/2 | 5 patches | 14 replies | Superseded | |
| v1 posting 2/2 | 5 patches | 4 replies | Superseded | |
| v2 RFC posting 1/2 | 3 patches | 0 replies | Superseded | |
| v1 RFC posting 1/2 | 3 patches | 7 replies | Superseded |
Changes in v5 from the cover letter · 17 lines
- Rebased
- Documentation clarifications, typo fixes
- Added an early out in CpumaskIter::next to avoid WARNs under certain configs
- CpuGuard functions are now #[inline]
- PerCpuNumerics now use ptr::cast<$ty> to get a *mut $ty rather than ptr::cast<*mut $ty which gives a *mut *mut $ty.
- Changed make_optimization_test!'s CpuGuard to be bound to a name rather than _ to avoid it getting dropped immediately
- Remove DynamicPerCpu::alloc in patch 8 since it's not necessary at that point
- CheckedPerCpu::get now has a &self reciever rather than a &mut reciever.
- Consolidated the non-zeroable dynamic per-cpu support into the introductory patches
- CpuGuards were previously automatically Send and Sync, even
though that doesn't make sense for that type. So, added a PhantomData<*const ()> to prevent those from automatically being applied.
- Impl FusedIterator for the cpumask iterator
- Used the cached self.ptr in DynamicPerCpu's get and get_mut since there's no reason not to save the indirection.
- Added $crate::percpu:: to PerCpuSyncMarkerType and StaticPerCpuSymbol in the define_per_cpu! macro to avoid needing
extra imports where its used. (Thanks Andreas Hindborg)
- Cleaned up logic in CpumaskIter::next (Thanks Yury Norov)
- Link to v4: https://lore.kernel.org/r/[email protected]
Patches in v5 No applies recorded yet
| # | Subject and files | Size | Replies | Applied |
|---|---|---|---|---|
| 1/8 | rust: cpumask: Add a `Cpumask` iteratorrust/ rust/ | +56 | 0 replies | |
| 2/8 | rust: cpumask: Add getters for globally defined cpumasksrust/ | +46 | 0 replies | |
| 3/8 | rust: percpu: Add C bindings for per-CPU variable APIrust/ rust/ rust/ | +26 | 0 replies | |
| 4/8 | rust: percpu: introduce a rust API for static per-CPU variablesrust/ rust/ rust/ +1 more | +528 | 0 replies | |
| 5/8 | rust: percpu: introduce a rust API for dynamic per-CPU variablesrust/ rust/ rust/ | +255 | 0 replies | |
| 6/8 | rust: percpu: add a rust per-CPU variable samplerust/ rust/ samples/ +2 more | +290 | 0 replies | |
| 7/8 | rust: percpu: Add pin-hole optimizations for numericsrust/ rust/ rust/ +1 more | +184 | 3 replies | |
| 8/8 | rust: percpu: cache per-CPU pointers in the dynamic caserust/ rust/ | +20 | 0 replies |
Reviews trailers per patch
2 of 8 patches have a Reviewed-by or Acked-by.
| Patch | Viresh Kumar |
|---|---|
| 1/8 | A-b |
| 2/8 | A-b |
| 3/8 | |
| 4/8 | |
| 5/8 | |
| 6/8 | |
| 7/8 | |
| 8/8 |
Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes.
Cover letter [PATCH v5 0/8] rust: Add Per-CPU Variable API
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.
---
---
Changes in v5:
- Rebased
- Documentation clarifications, typo fixes
- Added an early out in CpumaskIter::next to avoid WARNs under certain configs
- CpuGuard functions are now #[inline]
- PerCpuNumerics now use ptr::cast<$ty> to get a *mut $ty rather than ptr::cast<*mut $ty which gives a *mut *mut $ty.
- Changed make_optimization_test!'s CpuGuard to be bound to a name rather than _ to avoid it getting dropped immediately
- Remove DynamicPerCpu::alloc in patch 8 since it's not necessary at that point
- CheckedPerCpu::get now has a &self reciever rather than a &mut reciever.
- Consolidated the non-zeroable dynamic per-cpu support into the introductory patches
- CpuGuards were previously automatically Send and Sync, even
though that doesn't make sense for that type. So, added a PhantomData<*const ()> to prevent those from automatically being applied.
- Impl FusedIterator for the cpumask iterator
- Used the cached self.ptr in DynamicPerCpu's get and get_mut since there's no reason not to save the indirection.
- Added $crate::percpu:: to PerCpuSyncMarkerType and StaticPerCpuSymbol in the define_per_cpu! macro to avoid needing
extra imports where its used. (Thanks Andreas Hindborg)
- Cleaned up logic in CpumaskIter::next (Thanks Yury Norov)
- Link to v4: https://lore.kernel.org/r/[email protected]
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/[email protected]
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/[email protected]
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/[email protected]
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/[email protected]
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/[email protected]
---
Mitchell Levy (8):
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: Add pin-hole optimizations for numerics
rust: percpu: cache per-CPU pointers in the dynamic case
rust/helpers/cpumask.c | 6 + rust/helpers/helpers.c | 2 + rust/helpers/percpu.c | 22 +++ rust/helpers/preempt.c | 15 ++ rust/kernel/cpumask.rs | 97 ++++++++++++- rust/kernel/lib.rs | 3 + rust/kernel/percpu.rs | 282 ++++++++++++++++++++++++++++++++++++ rust/kernel/percpu/cpu_guard.rs | 48 ++++++ rust/kernel/percpu/dynamic.rs | 227 +++++++++++++++++++++++++++++ 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 | 314 ++++++++++++++++++++++++++++++++++++++++ 14 files changed, 1381 insertions(+), 1 deletion(-)
---
base-commit: 8a23051ed8584215b22368e9501f771ef98f0c1d
change-id: 20240813-rust-percpu-ea2f54b5da33
Best regards,
Signature · 1 line
Mitchell Levy <[email protected]>