Re: [PATCH v2 5/8] rust: dma: add Coherent:init() and Coherent::init_with_attrs()

From: Andreas Hindborg

Date: Tue Mar 24 2026 - 10:11:53 EST


"Danilo Krummrich" <dakr@xxxxxxxxxx> 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 <dakr@xxxxxxxxxx>
> ---
> 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 <a.hindborg@xxxxxxxxxx>


Best regards,
Andreas Hindborg