* [PATCH v4] rust: sync: Accept errors for Lock payload data
@ 2026-10-22 16:07 Philipp Stanner
0 siblings, 0 replies; only message in thread
From: Philipp Stanner @ 2026-10-22 16:07 UTC (permalink / raw)
To: Peter Zijlstra, Ingo Molnar, Will Deacon, Boqun Feng,
Waiman Long, Gary Guo, Alice Ryhl, Lyude Paul, Daniel Almeida,
Onur Özkan, Miguel Ojeda, Björn Roy Baron,
Benno Lossin, Andreas Hindborg, Trevor Gross, Danilo Krummrich,
Tamir Duberstein, Alexandre Courbot
Cc: linux-kernel, rust-for-linux, Philipp Stanner
The `Lock` baseclass currently does not allow for fallible user-data.
This can cause conflicts when used with other primitives, for example
when a lock shall be pin-initialized with payload data that is fallible.
Add support for the lock base class so that it works with
try_pin_init!(). Adjust spinlock and mutex accordingly.
Signed-off-by: Philipp Stanner <phasta@kernel.org>
---
Changes in v4:
- Do imports at appropriate places. (Gary)
- Remove unnecessary changes from pin_init to try_pin_init. (Gary)
- re-run rustfmt.
Changes in v3:
- Vertical formatting for imports
Changes in v2:
- Don't import prelude in doctests. (Gary)
- Keep using pin_init! over try_pin_init! in Lock::new(). (Gary)
---
rust/kernel/sync/lock.rs | 28 +++++++++++++++++++++-------
rust/kernel/sync/lock/spinlock.rs | 5 +----
2 files changed, 22 insertions(+), 11 deletions(-)
diff --git a/rust/kernel/sync/lock.rs b/rust/kernel/sync/lock.rs
index 10b6b5e9b024..05a123fff0ae 100644
--- a/rust/kernel/sync/lock.rs
+++ b/rust/kernel/sync/lock.rs
@@ -7,11 +7,22 @@
use super::LockClassKey;
use crate::{
- str::{CStr, CStrExt as _},
+ prelude::*,
+ str::CStr,
types::{NotThreadSafe, Opaque, ScopeGuard},
};
-use core::{cell::UnsafeCell, marker::PhantomPinned, pin::Pin};
-use pin_init::{pin_data, pin_init, PinInit, Wrapper};
+
+use core::{
+ cell::UnsafeCell,
+ convert::Infallible,
+ marker::PhantomPinned,
+ pin::Pin, //
+};
+use pin_init::{
+ pin_data,
+ PinInit,
+ Wrapper, //
+};
pub mod mutex;
pub mod spinlock;
@@ -128,11 +139,14 @@ unsafe impl<T: ?Sized + Send, B: Backend> Sync for Lock<T, B> {}
impl<T, B: Backend> Lock<T, B> {
/// Constructs a new lock initialiser.
- pub fn new(
- t: impl PinInit<T>,
+ pub fn new<E>(
+ t: impl PinInit<T, E>,
name: &'static CStr,
key: Pin<&'static LockClassKey>,
- ) -> impl PinInit<Self> {
+ ) -> impl PinInit<Self, E>
+ where
+ E: From<Infallible>,
+ {
pin_init!(Self {
data <- UnsafeCell::pin_init(t),
_pin: PhantomPinned,
@@ -141,7 +155,7 @@ pub fn new(
state <- Opaque::ffi_init(|slot| unsafe {
B::init(slot, name.as_char_ptr(), key.as_ptr())
}),
- })
+ }? E)
}
}
diff --git a/rust/kernel/sync/lock/spinlock.rs b/rust/kernel/sync/lock/spinlock.rs
index 6a71bb3a5c45..b8b7492a99e5 100644
--- a/rust/kernel/sync/lock/spinlock.rs
+++ b/rust/kernel/sync/lock/spinlock.rs
@@ -4,10 +4,7 @@
//!
//! This module allows Rust code to use the kernel's `spinlock_t`.
use super::*;
-use crate::{
- interrupt::LocalInterruptDisabled,
- prelude::*, //
-};
+use crate::interrupt::LocalInterruptDisabled;
/// Creates a [`SpinLock`] initialiser with the given name and a newly-created lock class.
///
base-commit: 7be4bc52fd9e0e55dc9a2e0232b89427d2c4b614
--
2.56.0
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2026-10-22 16:07 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-22 16:07 [PATCH v4] rust: sync: Accept errors for Lock payload data Philipp Stanner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®