All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andreas Hindborg <nmi@metaspace.dk>
To: Benno Lossin <y86-dev@protonmail.com>
Cc: "Miguel Ojeda" <ojeda@kernel.org>,
	"Alex Gaynor" <alex.gaynor@gmail.com>,
	"Wedson Almeida Filho" <wedsonaf@gmail.com>,
	"Boqun Feng" <boqun.feng@gmail.com>,
	"Gary Guo" <gary@garyguo.net>,
	"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
	"Alice Ryhl" <alice@ryhl.io>,
	rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org,
	patches@lists.linux.dev, "Alice Ryhl" <aliceryhl@google.com>,
	"Andreas Hindborg" <a.hindborg@samsung.com>
Subject: Re: [PATCH v7 13/15] rust: types: add `Opaque::ffi_init`
Date: Sat, 08 Apr 2023 17:21:19 +0200	[thread overview]
Message-ID: <87h6tqs8kl.fsf@metaspace.dk> (raw)
In-Reply-To: <20230408122429.1103522-14-y86-dev@protonmail.com>


Benno Lossin <y86-dev@protonmail.com> writes:

> This function allows to easily initialize `Opaque` with the pin-init
> API. `Opaque::ffi_init` takes a closure and returns a pin-initializer.
> This pin-initiailizer calls the given closure with a pointer to the
> inner `T`.
>
> Co-developed-by: Gary Guo <gary@garyguo.net>
> Signed-off-by: Gary Guo <gary@garyguo.net>
> Signed-off-by: Benno Lossin <y86-dev@protonmail.com>
> Cc: Alice Ryhl <aliceryhl@google.com>
> Cc: Andreas Hindborg <a.hindborg@samsung.com>
> ---

Reviewed-by: Andreas Hindborg <a.hindborg@samsung.com>

>  rust/kernel/init.rs  |  9 +++++++++
>  rust/kernel/types.rs | 20 ++++++++++++++++++++
>  2 files changed, 29 insertions(+)
>
> diff --git a/rust/kernel/init.rs b/rust/kernel/init.rs
> index ffd539e2f5ef..a1298c8bbda0 100644
> --- a/rust/kernel/init.rs
> +++ b/rust/kernel/init.rs
> @@ -177,6 +177,14 @@
>  //! }
>  //! ```
>  //!
> +//! For the special case where initializing a field is a single FFI-function call that cannot fail,
> +//! there exist the helper function [`Opaque::ffi_init`]. This function initialize a single
> +//! [`Opaque`] field by just delegating to the supplied closure. You can use these in combination
> +//! with [`pin_init!`].
> +//!
> +//! For more information on how to use [`pin_init_from_closure()`], take a look at the uses inside
> +//! the `kernel` crate. The [`sync`] module is a good starting point.
> +//!
>  //! [`sync`]: kernel::sync
>  //! [pinning]: https://doc.rust-lang.org/std/pin/index.html
>  //! [structurally pinned fields]:
> @@ -187,6 +195,7 @@
>  //! [`impl PinInit<T, E>`]: PinInit
>  //! [`impl Init<T, E>`]: Init
>  //! [`Opaque`]: kernel::types::Opaque
> +//! [`Opaque::ffi_init`]: kernel::types::Opaque::ffi_init
>  //! [`pin_data`]: ::macros::pin_data
>
>  use crate::{
> diff --git a/rust/kernel/types.rs b/rust/kernel/types.rs
> index ff2b2fac951d..3a46ec1a00cd 100644
> --- a/rust/kernel/types.rs
> +++ b/rust/kernel/types.rs
> @@ -2,6 +2,7 @@
>
>  //! Kernel types.
>
> +use crate::init::{self, PinInit};
>  use alloc::boxed::Box;
>  use core::{
>      cell::UnsafeCell,
> @@ -234,6 +235,25 @@ impl<T> Opaque<T> {
>          Self(MaybeUninit::uninit())
>      }
>
> +    /// 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
> +    /// `Opaque`. Since this memory is uninitialized, the closure is not allowed to read from it.
> +    ///
> +    /// This function is safe, because the `T` inside of an `Opaque` is allowed to be
> +    /// uninitialized. Additionally, access to the inner `T` requires `unsafe`, so the caller needs
> +    /// to verify at that point that the inner value is valid.
> +    pub fn ffi_init(init_func: impl FnOnce(*mut T)) -> impl PinInit<Self> {
> +        // SAFETY: We contain a `MaybeUninit`, so it is OK for the `init_func` to not fully
> +        // initiailize the `T`.
> +        unsafe {
> +            init::pin_init_from_closure::<_, ::core::convert::Infallible>(move |slot| {
> +                init_func(Self::raw_get(slot));
> +                Ok(())
> +            })
> +        }
> +    }
> +
>      /// Returns a raw pointer to the opaque data.
>      pub fn get(&self) -> *mut T {
>          UnsafeCell::raw_get(self.0.as_ptr())


  reply	other threads:[~2023-04-08 15:22 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-04-08 12:25 [PATCH v7 00/15] Rust pin-init API for pinned initialization of structs Benno Lossin
2023-04-08 12:25 ` [PATCH v7 01/15] rust: enable the `pin_macro` feature Benno Lossin
2023-04-08 12:25 ` [PATCH v7 02/15] rust: macros: add `quote!` macro Benno Lossin
2023-04-08 12:25 ` [PATCH v7 03/15] rust: sync: change error type of constructor functions Benno Lossin
2023-04-08 12:25 ` [PATCH v7 04/15] rust: sync: add `assume_init` to `UniqueArc` Benno Lossin
2023-04-08 12:25 ` [PATCH v7 05/15] rust: types: add `Opaque::raw_get` Benno Lossin
2023-04-08 12:25 ` [PATCH v7 06/15] rust: add pin-init API core Benno Lossin
2023-04-08 12:25 ` [PATCH v7 07/15] rust: init: add initialization macros Benno Lossin
2023-04-08 12:25 ` [PATCH v7 08/15] rust: init/sync: add `InPlaceInit` trait to pin-initialize smart pointers Benno Lossin
2023-04-08 12:26 ` [PATCH v7 09/15] rust: init: add `PinnedDrop` trait and macros Benno Lossin
2023-04-08 12:26 ` [PATCH v7 10/15] rust: init: add `stack_pin_init!` macro Benno Lossin
2023-04-08 12:26 ` [PATCH v7 11/15] rust: init: add `Zeroable` trait and `init::zeroed` function Benno Lossin
2023-04-08 12:26 ` [PATCH v7 12/15] rust: prelude: add `pin-init` API items to prelude Benno Lossin
2023-04-08 12:26 ` [PATCH v7 13/15] rust: types: add `Opaque::ffi_init` Benno Lossin
2023-04-08 15:21   ` Andreas Hindborg [this message]
2023-04-11  8:12   ` Alice Ryhl
2023-04-08 12:26 ` [PATCH v7 14/15] rust: sync: reduce stack usage of `UniqueArc::try_new_uninit` Benno Lossin
2023-04-08 12:26 ` [PATCH v7 15/15] rust: sync: add functions for initializing `UniqueArc<MaybeUninit<T>>` Benno Lossin
2023-04-10 22:54 ` [PATCH v7 00/15] Rust pin-init API for pinned initialization of structs Miguel Ojeda
2023-04-12 20:13 ` y86-dev
2023-04-12 20:15   ` Miguel Ojeda

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=87h6tqs8kl.fsf@metaspace.dk \
    --to=nmi@metaspace.dk \
    --cc=a.hindborg@samsung.com \
    --cc=alex.gaynor@gmail.com \
    --cc=alice@ryhl.io \
    --cc=aliceryhl@google.com \
    --cc=bjorn3_gh@protonmail.com \
    --cc=boqun.feng@gmail.com \
    --cc=gary@garyguo.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=ojeda@kernel.org \
    --cc=patches@lists.linux.dev \
    --cc=rust-for-linux@vger.kernel.org \
    --cc=wedsonaf@gmail.com \
    --cc=y86-dev@protonmail.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.