Messages in this thread | | | From | Wedson Almeida Filho <> | Date | Fri, 29 Mar 2024 21:57:11 -0300 | Subject | Re: [PATCH v3 06/10] rust: alloc: introduce the `BoxExt` trait |
| |
On Fri, 29 Mar 2024 at 15:00, Boqun Feng <boqun.feng@gmail.com> wrote: > > On Wed, Mar 27, 2024 at 10:35:59PM -0300, Wedson Almeida Filho wrote: > > From: Wedson Almeida Filho <walmeida@microsoft.com> > > > > Make fallible versions of `new` and `new_uninit` methods available in > > `Box` even though it doesn't implement them because we build `alloc` > > with the `no_global_oom_handling` config. > > > > They also have an extra `flags` parameter that allows callers to pass > > flags to the allocator. > > > > Signed-off-by: Wedson Almeida Filho <walmeida@microsoft.com> > > Reviewed-by: Boqun Feng <boqun.feng@gmail.com> > > A small nit below.. > > > --- > > rust/kernel/alloc.rs | 1 + > > rust/kernel/alloc/allocator.rs | 2 +- > > rust/kernel/alloc/box_ext.rs | 60 ++++++++++++++++++++++++++++++++++ > > rust/kernel/init.rs | 13 ++++---- > > rust/kernel/prelude.rs | 2 +- > > rust/kernel/sync/arc.rs | 3 +- > > 6 files changed, 72 insertions(+), 9 deletions(-) > > create mode 100644 rust/kernel/alloc/box_ext.rs > > > > diff --git a/rust/kernel/alloc.rs b/rust/kernel/alloc.rs > > index fd5541991a22..9bc1b48b5641 100644 > > --- a/rust/kernel/alloc.rs > > +++ b/rust/kernel/alloc.rs > > @@ -5,6 +5,7 @@ > > #[cfg(not(test))] > > #[cfg(not(testlib))] > > mod allocator; > > +pub mod box_ext; > > pub mod vec_ext; > > > > /// Flags to be used when allocating memory. > > diff --git a/rust/kernel/alloc/allocator.rs b/rust/kernel/alloc/allocator.rs > > index 8cc7099d6ae1..ff88bce04fd4 100644 > > --- a/rust/kernel/alloc/allocator.rs > > +++ b/rust/kernel/alloc/allocator.rs > > @@ -16,7 +16,7 @@ > > /// > > /// - `ptr` can be either null or a pointer which has been allocated by this allocator. > > /// - `new_layout` must have a non-zero size. > > -unsafe fn krealloc_aligned(ptr: *mut u8, new_layout: Layout, flags: Flags) -> *mut u8 { > > +pub(crate) unsafe fn krealloc_aligned(ptr: *mut u8, new_layout: Layout, flags: Flags) -> *mut u8 { > > // Customized layouts from `Layout::from_size_align()` can have size < align, so pad first. > > let layout = new_layout.pad_to_align(); > > > > diff --git a/rust/kernel/alloc/box_ext.rs b/rust/kernel/alloc/box_ext.rs > > new file mode 100644 > > index 000000000000..c62db0aa4dd1 > > --- /dev/null > > +++ b/rust/kernel/alloc/box_ext.rs > > @@ -0,0 +1,60 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > + > > +//! Extensions to [`Box`] for fallible allocations. > > + > > +use super::Flags; > > +use alloc::boxed::Box; > > +use core::alloc::AllocError; > > +use core::mem::MaybeUninit; > > +use core::result::Result; > > + > > +/// Extensions to [`Box`]. > > +pub trait BoxExt<T>: Sized { > > + /// Allocates a new box. > > + /// > > + /// The allocation may fail, in which case an error is returned. > > + fn new(x: T, flags: Flags) -> Result<Self, AllocError>; > > + > > + /// Allocates a new uninitialised box. > > + /// > > + /// The allocation may fail, in which case an error is returned. > > + fn new_uninit(flags: Flags) -> Result<Box<MaybeUninit<T>>, AllocError>; > > +} > > + > > +impl<T> BoxExt<T> for Box<T> { > > + fn new(x: T, flags: Flags) -> Result<Self, AllocError> { > > + let mut b = <Self as BoxExt<_>>::new_uninit(flags)?; > > + b.write(x); > > + // SAFETY: The contents were just initialised in the line above. > > + Ok(unsafe { b.assume_init() }) > > , since we have the new_uninit feature selected, we can actually do > > fn new(x: T, flags: Flags) -> Result<Self, AllocError> { > <Self as BoxExt<_>>::new_uninit(flags).map(|b| Box::write(b, x)) > }
Oh, this avoids an unsafe block, I like it. Though I think I'm going to do a slightly different version:
let b = <Self as BoxExt<_>>::new_uninit(flags)?; Ok(Box::write(b, x))
> here. > > Regards, > Boqun > > > + } > > + > [...]
| |