2023-02-24 08:10:08

by Asahi Lina

[permalink] [raw]
Subject: [PATCH] rust: Enable the new_uninit feature for kernel and driver crates

The unstable new_uninit feature enables various library APIs to create
uninitialized containers, such as `Box::assume_init()`. This is
necessary to build abstractions that directly initialize memory at the
target location, instead of doing copies through the stack.

Will be used by the DRM scheduler abstraction in the kernel crate, and
by field-wise initialization (e.g. using `place!()` or a future
replacement macro which may itself live in `kernel`) in driver crates.

See [1] [2] [3] for background information.

[1] https://github.com/Rust-for-Linux/linux/issues/879
[2] https://github.com/Rust-for-Linux/linux/issues/2
[3] https://github.com/rust-lang/rust/issues/63291

Signed-off-by: Asahi Lina <[email protected]>
---
rust/kernel/lib.rs | 1 +
scripts/Makefile.build | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs
index 223564f9f0cc..1118cd3e0b5f 100644
--- a/rust/kernel/lib.rs
+++ b/rust/kernel/lib.rs
@@ -17,6 +17,7 @@
#![feature(core_ffi_c)]
#![feature(dispatch_from_dyn)]
#![feature(generic_associated_types)]
+#![feature(new_uninit)]
#![feature(receiver_trait)]
#![feature(unsize)]

diff --git a/scripts/Makefile.build b/scripts/Makefile.build
index a0d5c6cca76d..0f637e1ca8dc 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -277,7 +277,7 @@ $(obj)/%.lst: $(src)/%.c FORCE
# Compile Rust sources (.rs)
# ---------------------------------------------------------------------------

-rust_allowed_features := core_ffi_c
+rust_allowed_features := core_ffi_c,new_uninit

rust_common_cmd = \
RUST_MODFILE=$(modfile) $(RUSTC_OR_CLIPPY) $(rust_flags) \

---
base-commit: 83f978b63fa7ad474ca22d7e2772c5988101c9bd
change-id: 20230224-rust-new_uninit-a575d34987c3

Thank you,
~~ Lina



Subject: Re: [PATCH] rust: Enable the new_uninit feature for kernel and driver crates

On Fri, Feb 24, 2023 at 05:09:47PM +0900, Asahi Lina wrote:
> The unstable new_uninit feature enables various library APIs to create
> uninitialized containers, such as `Box::assume_init()`. This is
> necessary to build abstractions that directly initialize memory at the
> target location, instead of doing copies through the stack.
>
> Will be used by the DRM scheduler abstraction in the kernel crate, and
> by field-wise initialization (e.g. using `place!()` or a future
> replacement macro which may itself live in `kernel`) in driver crates.

Very useful to me as some constructors in the USB bindings that I'm
writting might make use of unitialized memory.

Reviewed-by: Martin Rodriguez Reboredo <[email protected]>

2023-02-25 00:45:41

by Gary Guo

[permalink] [raw]
Subject: Re: [PATCH] rust: Enable the new_uninit feature for kernel and driver crates

On Fri, 24 Feb 2023 17:09:47 +0900
Asahi Lina <[email protected]> wrote:

> The unstable new_uninit feature enables various library APIs to create
> uninitialized containers, such as `Box::assume_init()`. This is
> necessary to build abstractions that directly initialize memory at the
> target location, instead of doing copies through the stack.
>
> Will be used by the DRM scheduler abstraction in the kernel crate, and
> by field-wise initialization (e.g. using `place!()` or a future
> replacement macro which may itself live in `kernel`) in driver crates.
>
> See [1] [2] [3] for background information.
>
> [1] https://github.com/Rust-for-Linux/linux/issues/879
> [2] https://github.com/Rust-for-Linux/linux/issues/2
> [3] https://github.com/rust-lang/rust/issues/63291
>
> Signed-off-by: Asahi Lina <[email protected]>

Reviewed-by: Gary Guo <[email protected]>

> ---
> rust/kernel/lib.rs | 1 +
> scripts/Makefile.build | 2 +-
> 2 files changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs
> index 223564f9f0cc..1118cd3e0b5f 100644
> --- a/rust/kernel/lib.rs
> +++ b/rust/kernel/lib.rs
> @@ -17,6 +17,7 @@
> #![feature(core_ffi_c)]
> #![feature(dispatch_from_dyn)]
> #![feature(generic_associated_types)]
> +#![feature(new_uninit)]
> #![feature(receiver_trait)]
> #![feature(unsize)]
>
> diff --git a/scripts/Makefile.build b/scripts/Makefile.build
> index a0d5c6cca76d..0f637e1ca8dc 100644
> --- a/scripts/Makefile.build
> +++ b/scripts/Makefile.build
> @@ -277,7 +277,7 @@ $(obj)/%.lst: $(src)/%.c FORCE
> # Compile Rust sources (.rs)
> # ---------------------------------------------------------------------------
>
> -rust_allowed_features := core_ffi_c
> +rust_allowed_features := core_ffi_c,new_uninit
>
> rust_common_cmd = \
> RUST_MODFILE=$(modfile) $(RUSTC_OR_CLIPPY) $(rust_flags) \
>
> ---
> base-commit: 83f978b63fa7ad474ca22d7e2772c5988101c9bd
> change-id: 20230224-rust-new_uninit-a575d34987c3
>
> Thank you,
> ~~ Lina
>


2023-02-27 13:15:35

by Andreas Hindborg

[permalink] [raw]
Subject: Re: [PATCH] rust: Enable the new_uninit feature for kernel and driver crates


Asahi Lina <[email protected]> writes:

> The unstable new_uninit feature enables various library APIs to create
> uninitialized containers, such as `Box::assume_init()`. This is
> necessary to build abstractions that directly initialize memory at the
> target location, instead of doing copies through the stack.
>
> Will be used by the DRM scheduler abstraction in the kernel crate, and
> by field-wise initialization (e.g. using `place!()` or a future
> replacement macro which may itself live in `kernel`) in driver crates.
>
> See [1] [2] [3] for background information.
>
> [1] https://github.com/Rust-for-Linux/linux/issues/879
> [2] https://github.com/Rust-for-Linux/linux/issues/2
> [3] https://github.com/rust-lang/rust/issues/63291
>
> Signed-off-by: Asahi Lina <[email protected]>
> ---
> rust/kernel/lib.rs | 1 +
> scripts/Makefile.build | 2 +-
> 2 files changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs
> index 223564f9f0cc..1118cd3e0b5f 100644
> --- a/rust/kernel/lib.rs
> +++ b/rust/kernel/lib.rs
> @@ -17,6 +17,7 @@
> #![feature(core_ffi_c)]
> #![feature(dispatch_from_dyn)]
> #![feature(generic_associated_types)]
> +#![feature(new_uninit)]
> #![feature(receiver_trait)]
> #![feature(unsize)]
>
> diff --git a/scripts/Makefile.build b/scripts/Makefile.build
> index a0d5c6cca76d..0f637e1ca8dc 100644
> --- a/scripts/Makefile.build
> +++ b/scripts/Makefile.build
> @@ -277,7 +277,7 @@ $(obj)/%.lst: $(src)/%.c FORCE
> # Compile Rust sources (.rs)
> # ---------------------------------------------------------------------------
>
> -rust_allowed_features := core_ffi_c
> +rust_allowed_features := core_ffi_c,new_uninit

What is the purpose of adding the feature here? The kernel crate seems
to compile fine without this.

BR Andreas


2023-02-27 13:47:50

by Asahi Lina

[permalink] [raw]
Subject: Re: [PATCH] rust: Enable the new_uninit feature for kernel and driver crates

On 27/02/2023 22.09, Andreas Hindborg wrote:
>
> Asahi Lina <[email protected]> writes:
>
>> The unstable new_uninit feature enables various library APIs to create
>> uninitialized containers, such as `Box::assume_init()`. This is
>> necessary to build abstractions that directly initialize memory at the
>> target location, instead of doing copies through the stack.
>>
>> Will be used by the DRM scheduler abstraction in the kernel crate, and
>> by field-wise initialization (e.g. using `place!()` or a future
>> replacement macro which may itself live in `kernel`) in driver crates.
>>
>> See [1] [2] [3] for background information.
>>
>> [1] https://github.com/Rust-for-Linux/linux/issues/879
>> [2] https://github.com/Rust-for-Linux/linux/issues/2
>> [3] https://github.com/rust-lang/rust/issues/63291
>>
>> Signed-off-by: Asahi Lina <[email protected]>
>> ---
>> rust/kernel/lib.rs | 1 +
>> scripts/Makefile.build | 2 +-
>> 2 files changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs
>> index 223564f9f0cc..1118cd3e0b5f 100644
>> --- a/rust/kernel/lib.rs
>> +++ b/rust/kernel/lib.rs
>> @@ -17,6 +17,7 @@
>> #![feature(core_ffi_c)]
>> #![feature(dispatch_from_dyn)]
>> #![feature(generic_associated_types)]
>> +#![feature(new_uninit)]
>> #![feature(receiver_trait)]
>> #![feature(unsize)]
>>
>> diff --git a/scripts/Makefile.build b/scripts/Makefile.build
>> index a0d5c6cca76d..0f637e1ca8dc 100644
>> --- a/scripts/Makefile.build
>> +++ b/scripts/Makefile.build
>> @@ -277,7 +277,7 @@ $(obj)/%.lst: $(src)/%.c FORCE
>> # Compile Rust sources (.rs)
>> # ---------------------------------------------------------------------------
>>
>> -rust_allowed_features := core_ffi_c
>> +rust_allowed_features := core_ffi_c,new_uninit
>
> What is the purpose of adding the feature here? The kernel crate seems
> to compile fine without this.

It's for the upcoming DRM abstractions, as I mentioned in the commit
message. There's so many dependencies that I'm trying to get as much as
I can early to avoid having to review very big patchsets down the line ^^

~~ Lina

2023-02-27 13:49:06

by Miguel Ojeda

[permalink] [raw]
Subject: Re: [PATCH] rust: Enable the new_uninit feature for kernel and driver crates

On Mon, Feb 27, 2023 at 2:15 PM Andreas Hindborg <[email protected]> wrote:
>
> What is the purpose of adding the feature here? The kernel crate seems
> to compile fine without this.

`rust_allowed_features` is the list of features that crates outside
`rust/` can use (e.g. drivers).

The goal is to control which unstable features are used outside the
`kernel` crate and to avoid mistakenly relying on them.

Cheers,
Miguel

2023-02-27 14:38:01

by Andreas Hindborg

[permalink] [raw]
Subject: Re: [PATCH] rust: Enable the new_uninit feature for kernel and driver crates


Asahi Lina <[email protected]> writes:

> On 27/02/2023 22.09, Andreas Hindborg wrote:
>>
>> Asahi Lina <[email protected]> writes:
>>
>>> The unstable new_uninit feature enables various library APIs to create
>>> uninitialized containers, such as `Box::assume_init()`. This is
>>> necessary to build abstractions that directly initialize memory at the
>>> target location, instead of doing copies through the stack.
>>>
>>> Will be used by the DRM scheduler abstraction in the kernel crate, and
>>> by field-wise initialization (e.g. using `place!()` or a future
>>> replacement macro which may itself live in `kernel`) in driver crates.
>>>
>>> See [1] [2] [3] for background information.
>>>
>>> [1] https://github.com/Rust-for-Linux/linux/issues/879
>>> [2] https://github.com/Rust-for-Linux/linux/issues/2
>>> [3] https://github.com/rust-lang/rust/issues/63291
>>>
>>> Signed-off-by: Asahi Lina <[email protected]>
>>> ---
>>> rust/kernel/lib.rs | 1 +
>>> scripts/Makefile.build | 2 +-
>>> 2 files changed, 2 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs
>>> index 223564f9f0cc..1118cd3e0b5f 100644
>>> --- a/rust/kernel/lib.rs
>>> +++ b/rust/kernel/lib.rs
>>> @@ -17,6 +17,7 @@
>>> #![feature(core_ffi_c)]
>>> #![feature(dispatch_from_dyn)]
>>> #![feature(generic_associated_types)]
>>> +#![feature(new_uninit)]
>>> #![feature(receiver_trait)]
>>> #![feature(unsize)]
>>>
>>> diff --git a/scripts/Makefile.build b/scripts/Makefile.build
>>> index a0d5c6cca76d..0f637e1ca8dc 100644
>>> --- a/scripts/Makefile.build
>>> +++ b/scripts/Makefile.build
>>> @@ -277,7 +277,7 @@ $(obj)/%.lst: $(src)/%.c FORCE
>>> # Compile Rust sources (.rs)
>>> # ---------------------------------------------------------------------------
>>>
>>> -rust_allowed_features := core_ffi_c
>>> +rust_allowed_features := core_ffi_c,new_uninit
>>
>> What is the purpose of adding the feature here? The kernel crate seems
>> to compile fine without this.
>
> It's for the upcoming DRM abstractions, as I mentioned in the commit
> message. There's so many dependencies that I'm trying to get as much as
> I can early to avoid having to review very big patchsets down the line ^^

I got confused on the different makefile rules used to build kernel
crate vs module crates. Looks good ????

Reviewed-by: Andreas Hindborg <[email protected]>


2023-03-01 17:24:35

by Vincenzo Palazzo

[permalink] [raw]
Subject: Re: [PATCH] rust: Enable the new_uninit feature for kernel and driver crates

> The unstable new_uninit feature enables various library APIs to create
> uninitialized containers, such as `Box::assume_init()`. This is
> necessary to build abstractions that directly initialize memory at the
> target location, instead of doing copies through the stack.
>
> Will be used by the DRM scheduler abstraction in the kernel crate, and
> by field-wise initialization (e.g. using `place!()` or a future
> replacement macro which may itself live in `kernel`) in driver crates.
>
> See [1] [2] [3] for background information.
>
> [1] https://github.com/Rust-for-Linux/linux/issues/879
> [2] https://github.com/Rust-for-Linux/linux/issues/2
> [3] https://github.com/rust-lang/rust/issues/63291
>
> Signed-off-by: Asahi Lina <[email protected]>
> ---

Reviewed-by: Vincenzo Palazzo <[email protected]>

2023-04-10 03:16:53

by Miguel Ojeda

[permalink] [raw]
Subject: Re: [PATCH] rust: Enable the new_uninit feature for kernel and driver crates

On Fri, Feb 24, 2023 at 9:10 AM Asahi Lina <[email protected]> wrote:
>
> The unstable new_uninit feature enables various library APIs to create
> uninitialized containers, such as `Box::assume_init()`. This is
> necessary to build abstractions that directly initialize memory at the
> target location, instead of doing copies through the stack.
>
> Will be used by the DRM scheduler abstraction in the kernel crate, and
> by field-wise initialization (e.g. using `place!()` or a future
> replacement macro which may itself live in `kernel`) in driver crates.
>
> See [1] [2] [3] for background information.
>
> [1] https://github.com/Rust-for-Linux/linux/issues/879
> [2] https://github.com/Rust-for-Linux/linux/issues/2
> [3] https://github.com/rust-lang/rust/issues/63291

Applied to `rust-next` (reworded to use `Link` tags). Thanks!

Cheers,
Miguel