diff options
Diffstat (limited to 'rust/kernel/init.rs')
| -rw-r--r-- | rust/kernel/init.rs | 74 | 
1 files changed, 41 insertions, 33 deletions
| diff --git a/rust/kernel/init.rs b/rust/kernel/init.rs index 424257284d16..68605b633e73 100644 --- a/rust/kernel/init.rs +++ b/rust/kernel/init.rs @@ -68,7 +68,7 @@  //! #     a <- new_mutex!(42, "Foo::a"),  //! #     b: 24,  //! # }); -//! let foo: Result<Pin<Box<Foo>>> = Box::pin_init(foo); +//! let foo: Result<Pin<Box<Foo>>> = Box::pin_init(foo, GFP_KERNEL);  //! ```  //!  //! For more information see the [`pin_init!`] macro. @@ -80,14 +80,15 @@  //!  //! ```rust  //! # use kernel::sync::{new_mutex, Arc, Mutex}; -//! let mtx: Result<Arc<Mutex<usize>>> = Arc::pin_init(new_mutex!(42, "example::mtx")); +//! let mtx: Result<Arc<Mutex<usize>>> = +//!     Arc::pin_init(new_mutex!(42, "example::mtx"), GFP_KERNEL);  //! ```  //!  //! To declare an init macro/function you just return an [`impl PinInit<T, E>`]:  //!  //! ```rust  //! # #![allow(clippy::disallowed_names)] -//! # use kernel::{sync::Mutex, prelude::*, new_mutex, init::PinInit, try_pin_init}; +//! # use kernel::{sync::Mutex, new_mutex, init::PinInit, try_pin_init};  //! #[pin_data]  //! struct DriverData {  //!     #[pin] @@ -99,7 +100,7 @@  //!     fn new() -> impl PinInit<Self, Error> {  //!         try_pin_init!(Self {  //!             status <- new_mutex!(0, "DriverData::status"), -//!             buffer: Box::init(kernel::init::zeroed())?, +//!             buffer: Box::init(kernel::init::zeroed(), GFP_KERNEL)?,  //!         })  //!     }  //! } @@ -121,7 +122,7 @@  //!  //! ```rust  //! # #![allow(unreachable_pub, clippy::disallowed_names)] -//! use kernel::{prelude::*, init, types::Opaque}; +//! use kernel::{init, types::Opaque};  //! use core::{ptr::addr_of_mut, marker::PhantomPinned, pin::Pin};  //! # mod bindings {  //! #     #![allow(non_camel_case_types)] @@ -210,13 +211,13 @@  //! [`pin_init!`]: crate::pin_init!  use crate::{ +    alloc::{box_ext::BoxExt, AllocError, Flags},      error::{self, Error},      sync::UniqueArc,      types::{Opaque, ScopeGuard},  };  use alloc::boxed::Box;  use core::{ -    alloc::AllocError,      cell::UnsafeCell,      convert::Infallible,      marker::PhantomData, @@ -305,9 +306,9 @@ macro_rules! stack_pin_init {  ///  /// stack_try_pin_init!(let foo: Result<Pin<&mut Foo>, AllocError> = pin_init!(Foo {  ///     a <- new_mutex!(42), -///     b: Box::try_new(Bar { +///     b: Box::new(Bar {  ///         x: 64, -///     })?, +///     }, GFP_KERNEL)?,  /// }));  /// let foo = foo.unwrap();  /// pr_info!("a: {}", &*foo.a.lock()); @@ -331,9 +332,9 @@ macro_rules! stack_pin_init {  ///  /// stack_try_pin_init!(let foo: Pin<&mut Foo> =? pin_init!(Foo {  ///     a <- new_mutex!(42), -///     b: Box::try_new(Bar { +///     b: Box::new(Bar {  ///         x: 64, -///     })?, +///     }, GFP_KERNEL)?,  /// }));  /// pr_info!("a: {}", &*foo.a.lock());  /// # Ok::<_, AllocError>(()) @@ -390,7 +391,7 @@ macro_rules! stack_try_pin_init {  ///     },  /// });  /// # initializer } -/// # Box::pin_init(demo()).unwrap(); +/// # Box::pin_init(demo(), GFP_KERNEL).unwrap();  /// ```  ///  /// Arbitrary Rust expressions can be used to set the value of a variable. @@ -412,7 +413,7 @@ macro_rules! stack_try_pin_init {  ///  /// ```rust  /// # #![allow(clippy::disallowed_names)] -/// # use kernel::{init, pin_init, prelude::*, init::*}; +/// # use kernel::{init, pin_init, init::*};  /// # use core::pin::Pin;  /// # #[pin_data]  /// # struct Foo { @@ -460,7 +461,7 @@ macro_rules! stack_try_pin_init {  /// #         })  /// #     }  /// # } -/// let foo = Box::pin_init(Foo::new()); +/// let foo = Box::pin_init(Foo::new(), GFP_KERNEL);  /// ```  ///  /// They can also easily embed it into their own `struct`s: @@ -600,7 +601,7 @@ macro_rules! pin_init {  /// impl BigBuf {  ///     fn new() -> impl PinInit<Self, Error> {  ///         try_pin_init!(Self { -///             big: Box::init(init::zeroed())?, +///             big: Box::init(init::zeroed(), GFP_KERNEL)?,  ///             small: [0; 1024 * 1024],  ///             ptr: core::ptr::null_mut(),  ///         }? Error) @@ -701,7 +702,7 @@ macro_rules! init {  /// impl BigBuf {  ///     fn new() -> impl Init<Self, Error> {  ///         try_init!(Self { -///             big: Box::init(zeroed())?, +///             big: Box::init(zeroed(), GFP_KERNEL)?,  ///             small: [0; 1024 * 1024],  ///         }? Error)  ///     } @@ -1013,7 +1014,7 @@ pub fn uninit<T, E>() -> impl Init<MaybeUninit<T>, E> {  ///  /// ```rust  /// use kernel::{error::Error, init::init_array_from_fn}; -/// let array: Box<[usize; 1_000]> = Box::init::<Error>(init_array_from_fn(|i| i)).unwrap(); +/// let array: Box<[usize; 1_000]> = Box::init::<Error>(init_array_from_fn(|i| i), GFP_KERNEL).unwrap();  /// assert_eq!(array.len(), 1_000);  /// ```  pub fn init_array_from_fn<I, const N: usize, T, E>( @@ -1057,7 +1058,7 @@ where  /// ```rust  /// use kernel::{sync::{Arc, Mutex}, init::pin_init_array_from_fn, new_mutex};  /// let array: Arc<[Mutex<usize>; 1_000]> = -///     Arc::pin_init(pin_init_array_from_fn(|i| new_mutex!(i))).unwrap(); +///     Arc::pin_init(pin_init_array_from_fn(|i| new_mutex!(i)), GFP_KERNEL).unwrap();  /// assert_eq!(array.len(), 1_000);  /// ```  pub fn pin_init_array_from_fn<I, const N: usize, T, E>( @@ -1115,7 +1116,7 @@ pub trait InPlaceInit<T>: Sized {      /// type.      ///      /// If `T: !Unpin` it will not be able to move afterwards. -    fn try_pin_init<E>(init: impl PinInit<T, E>) -> Result<Pin<Self>, E> +    fn try_pin_init<E>(init: impl PinInit<T, E>, flags: Flags) -> Result<Pin<Self>, E>      where          E: From<AllocError>; @@ -1123,7 +1124,7 @@ pub trait InPlaceInit<T>: Sized {      /// type.      ///      /// If `T: !Unpin` it will not be able to move afterwards. -    fn pin_init<E>(init: impl PinInit<T, E>) -> error::Result<Pin<Self>> +    fn pin_init<E>(init: impl PinInit<T, E>, flags: Flags) -> error::Result<Pin<Self>>      where          Error: From<E>,      { @@ -1131,16 +1132,16 @@ pub trait InPlaceInit<T>: Sized {          let init = unsafe {              pin_init_from_closure(|slot| init.__pinned_init(slot).map_err(|e| Error::from(e)))          }; -        Self::try_pin_init(init) +        Self::try_pin_init(init, flags)      }      /// Use the given initializer to in-place initialize a `T`. -    fn try_init<E>(init: impl Init<T, E>) -> Result<Self, E> +    fn try_init<E>(init: impl Init<T, E>, flags: Flags) -> Result<Self, E>      where          E: From<AllocError>;      /// Use the given initializer to in-place initialize a `T`. -    fn init<E>(init: impl Init<T, E>) -> error::Result<Self> +    fn init<E>(init: impl Init<T, E>, flags: Flags) -> error::Result<Self>      where          Error: From<E>,      { @@ -1148,17 +1149,17 @@ pub trait InPlaceInit<T>: Sized {          let init = unsafe {              init_from_closure(|slot| init.__pinned_init(slot).map_err(|e| Error::from(e)))          }; -        Self::try_init(init) +        Self::try_init(init, flags)      }  }  impl<T> InPlaceInit<T> for Box<T> {      #[inline] -    fn try_pin_init<E>(init: impl PinInit<T, E>) -> Result<Pin<Self>, E> +    fn try_pin_init<E>(init: impl PinInit<T, E>, flags: Flags) -> Result<Pin<Self>, E>      where          E: From<AllocError>,      { -        let mut this = Box::try_new_uninit()?; +        let mut this = <Box<_> as BoxExt<_>>::new_uninit(flags)?;          let slot = this.as_mut_ptr();          // SAFETY: When init errors/panics, slot will get deallocated but not dropped,          // slot is valid and will not be moved, because we pin it later. @@ -1168,11 +1169,11 @@ impl<T> InPlaceInit<T> for Box<T> {      }      #[inline] -    fn try_init<E>(init: impl Init<T, E>) -> Result<Self, E> +    fn try_init<E>(init: impl Init<T, E>, flags: Flags) -> Result<Self, E>      where          E: From<AllocError>,      { -        let mut this = Box::try_new_uninit()?; +        let mut this = <Box<_> as BoxExt<_>>::new_uninit(flags)?;          let slot = this.as_mut_ptr();          // SAFETY: When init errors/panics, slot will get deallocated but not dropped,          // slot is valid. @@ -1184,11 +1185,11 @@ impl<T> InPlaceInit<T> for Box<T> {  impl<T> InPlaceInit<T> for UniqueArc<T> {      #[inline] -    fn try_pin_init<E>(init: impl PinInit<T, E>) -> Result<Pin<Self>, E> +    fn try_pin_init<E>(init: impl PinInit<T, E>, flags: Flags) -> Result<Pin<Self>, E>      where          E: From<AllocError>,      { -        let mut this = UniqueArc::try_new_uninit()?; +        let mut this = UniqueArc::new_uninit(flags)?;          let slot = this.as_mut_ptr();          // SAFETY: When init errors/panics, slot will get deallocated but not dropped,          // slot is valid and will not be moved, because we pin it later. @@ -1198,11 +1199,11 @@ impl<T> InPlaceInit<T> for UniqueArc<T> {      }      #[inline] -    fn try_init<E>(init: impl Init<T, E>) -> Result<Self, E> +    fn try_init<E>(init: impl Init<T, E>, flags: Flags) -> Result<Self, E>      where          E: From<AllocError>,      { -        let mut this = UniqueArc::try_new_uninit()?; +        let mut this = UniqueArc::new_uninit(flags)?;          let slot = this.as_mut_ptr();          // SAFETY: When init errors/panics, slot will get deallocated but not dropped,          // slot is valid. @@ -1292,8 +1293,15 @@ impl_zeroable! {      i8, i16, i32, i64, i128, isize,      f32, f64, -    // SAFETY: These are ZSTs, there is nothing to zero. -    {<T: ?Sized>} PhantomData<T>, core::marker::PhantomPinned, Infallible, (), +    // Note: do not add uninhabited types (such as `!` or `core::convert::Infallible`) to this list; +    // creating an instance of an uninhabited type is immediate undefined behavior. For more on +    // uninhabited/empty types, consult The Rustonomicon: +    // <https://doc.rust-lang.org/stable/nomicon/exotic-sizes.html#empty-types>. The Rust Reference +    // also has information on undefined behavior: +    // <https://doc.rust-lang.org/stable/reference/behavior-considered-undefined.html>. +    // +    // SAFETY: These are inhabited ZSTs; there is nothing to zero and a valid value exists. +    {<T: ?Sized>} PhantomData<T>, core::marker::PhantomPinned, (),      // SAFETY: Type is allowed to take any value, including all zeros.      {<T>} MaybeUninit<T>, |