Re: [PATCH v5 13/26] rust: alloc: implement kernel `Vec` type

Danilo Krummrich
2024-08-14T22:46:49Z

On Wed, Aug 14, 2024 at 10:42:28AM +0200, Alice Ryhl wrote:
> > +#[macro_export]
> > +macro_rules! kvec {
> > + () => (
> > + {
> > + $crate::alloc::KVec::new()
> > + }
> > + );
> > + ($elem:expr; $n:expr) => (
> > + {
> > + $crate::alloc::KVec::from_elem($elem, $n, GFP_KERNEL)
> > + }
> > + );
> > + ($($x:expr),+ $(,)?) => (
> > + {
> > + match $crate::alloc::KBox::new([$($x),+], GFP_KERNEL) {
> > + Ok(b) => Ok($crate::alloc::KBox::into_vec(b)),
> > + Err(e) => Err(e),
>
> Hmm. This currently generates code that:
>
> 1. Creates the array.
> 2. Allocates the memory.
> 3. Moves the array into the box.
>
> Whereas the stdlib macro swaps step 1 and 2.

Isn't stdlib [1] doing the same thing I do?

[1] https://doc.rust-lang.org/1.80.1/src/alloc/macros.rs.html#49

> You can do the same by utilizing new_uninit. A sketch:
>
> match KBox::<[_; _]>::new_uninit(GFP_KERNEL) {

How do we get the size here? `#![feature(generic_arg_infer)]` seems to be
unstable.

> Ok(b) => Ok(KVec::from(KBox::write(b, [$($x),+]))),
> Err(e) => Err(e),
> }