mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 09:36:22 +02:00
rust: alloc: add Box::zeroed()
Add Box::zeroed() for T: Zeroable types. This allocates with __GFP_ZERO directly, letting the underlying allocator deal with zeroing out the memory compared to Box::new(T::zeroed(), flags). Reviewed-by: Alice Ryhl <aliceryhl@google.com> Link: https://patch.msgid.link/20260505152400.3905096-2-dakr@kernel.org Signed-off-by: Danilo Krummrich <dakr@kernel.org>
This commit is contained in:
parent
254f49634e
commit
abb21500e7
|
|
@ -19,6 +19,7 @@
|
|||
use crate::fmt;
|
||||
use crate::init::InPlaceInit;
|
||||
use crate::page::AsPageIter;
|
||||
use crate::prelude::*;
|
||||
use crate::types::ForeignOwnable;
|
||||
use pin_init::{InPlaceWrite, Init, PinInit, ZeroableOption};
|
||||
|
||||
|
|
@ -256,6 +257,27 @@ pub fn new_uninit(flags: Flags) -> Result<Box<MaybeUninit<T>, A>, AllocError> {
|
|||
Ok(Box(ptr.cast(), PhantomData))
|
||||
}
|
||||
|
||||
/// Creates a new zero-initialized `Box<T, A>`.
|
||||
///
|
||||
/// New memory is allocated with `A` and the [`__GFP_ZERO`] flag. The allocation may fail, in
|
||||
/// which case an error is returned. For ZSTs no memory is allocated.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// let b = KBox::<[u8; 128]>::zeroed(GFP_KERNEL)?;
|
||||
/// assert_eq!(*b, [0; 128]);
|
||||
/// # Ok::<(), Error>(())
|
||||
/// ```
|
||||
pub fn zeroed(flags: Flags) -> Result<Self, AllocError>
|
||||
where
|
||||
T: Zeroable,
|
||||
{
|
||||
// SAFETY: `__GFP_ZERO` guarantees the memory is zeroed; `T: Zeroable` guarantees that
|
||||
// all-zeroes is a valid bit pattern for `T`.
|
||||
Ok(unsafe { Self::new_uninit(flags | __GFP_ZERO)?.assume_init() })
|
||||
}
|
||||
|
||||
/// Constructs a new `Pin<Box<T, A>>`. If `T` does not implement [`Unpin`], then `x` will be
|
||||
/// pinned in memory and can't be moved.
|
||||
#[inline]
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user