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

Danilo Krummrich
2026-03-24T15:03:41Z

On Tue Mar 24, 2026 at 3:00 PM CET, Andreas Hindborg wrote:
>> + /// 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]>`.

This method is already compatible with arrays, T can be an array type itself,
e.g. T = [MyStruct; 5].

For instance, the diff in [1] should work.

> Reviewed-by: Andreas Hindborg <a.hindborg@kernel.org>

Thanks! The patch series has been applied yesterday, and the branch it has been
applied to is immutable, so I can't add additional tags.

However, the Link: included in the patch still points to this conversation.

Also note that subsequent review is still valued; we can always send follow-up
patches if required.

Thanks,
Danilo

[1]

diff --git a/samples/rust/rust_dma.rs b/samples/rust/rust_dma.rs
index 129bb4b39c04..3d3ffc21ea77 100644
--- a/samples/rust/rust_dma.rs
+++ b/samples/rust/rust_dma.rs
@@ -22,6 +22,7 @@
struct DmaSampleDriver {
pdev: ARef<pci::Device>,
ca: Coherent<[MyStruct]>,
+ ca_init: Coherent<[MyStruct; 5]>,
#[pin]
sgt: SGTable<Owned<VVec<u8>>>,
}
@@ -76,6 +77,15 @@ fn probe(pdev: &pci::Device<Core>, _info: &Self::IdInfo) -> impl PinInit<Self, E
kernel::dma_write!(ca, [i]?, MyStruct::new(value.0, value.1));
}

+ let ca_init: Coherent<[MyStruct; 5]> = Coherent::init(
+ pdev.as_ref(),
+ GFP_KERNEL,
+ pin_init::init_array_from_fn(|i| {
+ let (h, b) = TEST_VALUES[i];
+ MyStruct::new(h, b)
+ }),
+ )?;
+
let size = 4 * page::PAGE_SIZE;
let pages = VVec::with_capacity(size, GFP_KERNEL)?;

@@ -84,6 +94,7 @@ fn probe(pdev: &pci::Device<Core>, _info: &Self::IdInfo) -> impl PinInit<Self, E
Ok(try_pin_init!(Self {
pdev: pdev.into(),
ca,
+ ca_init,
sgt <- sgt,
}))
})
@@ -98,6 +109,12 @@ fn check_dma(&self) -> Result {

assert_eq!(val0, value.0);
assert_eq!(val1, value.1);
+
+ let val0 = kernel::dma_read!(self.ca_init, [i]?.h);
+ let val1 = kernel::dma_read!(self.ca_init, [i]?.b);
+
+ assert_eq!(val0, value.0);
+ assert_eq!(val1, value.1);
}

Ok(())