"Danilo Krummrich" <[email protected]> writes: > Analogous to Coherent::zeroed() and Coherent::zeroed_with_attrs(), add > Coherent:init() and Coherent::init_with_attrs() which both take an impl > Init<T, E> argument initializing the DMA coherent memory. > > Compared to CoherentInit, Coherent::init() is a one-shot constructor > that runs an Init closure and immediately exposes the DMA handle, > whereas CoherentInit is a multi-stage initializer that provides safe > &mut T access by withholding the DMA address until converted to > Coherent.
You forgot to update this to CoherentBox > > Signed-off-by: Danilo Krummrich <[email protected]> > --- > rust/kernel/dma.rs | 38 ++++++++++++++++++++++++++++++++++++++ > 1 file changed, 38 insertions(+) > > diff --git a/rust/kernel/dma.rs b/rust/kernel/dma.rs > index cefb54f0424a..6d2bec52806b 100644 > --- a/rust/kernel/dma.rs > +++ b/rust/kernel/dma.rs > @@ -709,6 +709,44 @@ pub fn zeroed(dev: &device::Device<Bound>, gfp_flags: > kernel::alloc::Flags) -> R > Self::zeroed_with_attrs(dev, gfp_flags, Attrs(0)) > } > > + /// Same as [`Coherent::zeroed_with_attrs`], but instead of a > zero-initialization the memory is > + /// initialized with `init`. > + pub fn init_with_attrs<E>( > + dev: &device::Device<Bound>, > + gfp_flags: kernel::alloc::Flags, > + dma_attrs: Attrs, > + init: impl Init<T, E>, > + ) -> Result<Self> > + where > + Error: From<E>, > + { > + let dmem = Self::alloc_with_attrs(dev, gfp_flags, dma_attrs)?; > + let ptr = dmem.as_mut_ptr(); > + > + // SAFETY: > + // - `ptr` is valid, properly aligned, and points to exclusively > owned memory. > + // - If `__init` fails, `self` is dropped, which safely frees the > underlying `Coherent`'s > + // DMA memory. `T: AsBytes + FromBytes` ensures there are no > complex `Drop` requirements > + // we are bypassing. > + unsafe { init.__init(ptr)? }; > + > + Ok(dmem) > + } > + > + /// Same as [`Coherent::zeroed`], but instead of a zero-initialization > the memory is initialized > + /// with `init`. > + #[inline] > + pub fn init<E>( > + dev: &device::Device<Bound>, > + gfp_flags: kernel::alloc::Flags, > + init: impl Init<T, E>, > + ) -> Result<Self> > + where > + Error: From<E>, > + { > + Self::init_with_attrs(dev, gfp_flags, Attrs(0), init) > + } > + I think we are missing an array initializer for `Coherent<[T]>`. Reviewed-by: Andreas Hindborg <[email protected]> Best regards, Andreas Hindborg
