On Thu, 19 Dec 2024 18:04:07 +0100 Danilo Krummrich <dakr@xxxxxxxxxx> wrote: > Analogous to `Opaque::new` add `Opaque::pin_init`, which instead of a > value `T` takes a `PinInit<T>` and returns a `PinInit<Opaque<T>>`. > > Reviewed-by: Alice Ryhl <aliceryhl@xxxxxxxxxx> > Suggested-by: Alice Ryhl <aliceryhl@xxxxxxxxxx> > Signed-off-by: Danilo Krummrich <dakr@xxxxxxxxxx> Reviewed-by: Gary Guo <gary@xxxxxxxxxxx> > --- > rust/kernel/types.rs | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/rust/kernel/types.rs b/rust/kernel/types.rs > index ec6457bb3084..3aea6af9a0bc 100644 > --- a/rust/kernel/types.rs > +++ b/rust/kernel/types.rs > @@ -281,6 +281,17 @@ pub const fn uninit() -> Self { > } > } > > + /// Create an opaque pin-initializer from the given pin-initializer. > + pub fn pin_init(slot: impl PinInit<T>) -> impl PinInit<Self> { > + Self::ffi_init(|ptr: *mut T| { > + // SAFETY: > + // - `ptr` is a valid pointer to uninitialized memory, > + // - `slot` is not accessed on error; the call is infallible, > + // - `slot` is pinned in memory. > + let _ = unsafe { init::PinInit::<T>::__pinned_init(slot, ptr) }; > + }) > + } > + > /// Creates a pin-initializer from the given initializer closure. > /// > /// The returned initializer calls the given closure with the pointer to the inner `T` of this