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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 8/15/24 9:30 AM, Alice Ryhl wrote:
On Thu, Aug 15, 2024 at 12:46 AM Danilo Krummrich <dakr@xxxxxxxxxx> wrote:

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

Stdlib is using something called #[rustc_box] which has the effect I described.

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.

It probably works if you don't specify the type at all:
`KBox::new_uninit`. But you should double check.

That works, thanks.


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





[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]

  Powered by Linux