diff options
| author | Gary Guo <gary@garyguo.net> | 2026-05-08 16:29:49 +0100 |
|---|---|---|
| committer | Gary Guo <gary@garyguo.net> | 2026-05-29 21:58:36 +0100 |
| commit | d2f309227952e73966682f348161094e40eb6440 (patch) | |
| tree | 2a4e1fe10031ddedc5a3356e989a692d78635675 /rust/pin-init | |
| parent | f85906616ec70d1d0178073b16ebd1c7f6ff1ee7 (diff) | |
rust: pin_init: internal: use `loop {}` to produce never value
In the `init!`/`pin_init!` macros, we rely on a trick that assigns never
(`!`) values to all mentioned fields in never-executed code to let the
compiler check that all fields have been initialized.
Currently we use `::core::panic!()` to produce this value, but before Rust
1.91.0, it creates outlined `panic_cold_explicit` functions which do not
get removed by the optimizer, thus leaving dead code behind in the binary.
This has been fixed by [1], which lands in Rust 1.91.0+, higher than the
kernel minimum version 1.85.0.
This causes ~200 dead `panic_cold_explicit` instances being included in the
binary, with ~90 of them from nova-core's usage of pin-init.
Work around the issue by using `loop {}` which creates the never value
without macro expansion or function call at all. All instances of
`panic_cold_explicit` outside libcore are removed by this change in my
kernel build.
Link: https://github.com/rust-lang/rust/pull/145304 [1]
Link: https://patch.msgid.link/20260508152950.833635-1-gary@kernel.org
Signed-off-by: Gary Guo <gary@garyguo.net>
Diffstat (limited to 'rust/pin-init')
| -rw-r--r-- | rust/pin-init/internal/src/init.rs | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/rust/pin-init/internal/src/init.rs b/rust/pin-init/internal/src/init.rs index 041a84593730..28d30805d06b 100644 --- a/rust/pin-init/internal/src/init.rs +++ b/rust/pin-init/internal/src/init.rs @@ -354,7 +354,7 @@ fn make_field_check( ::core::ptr::write(slot, #path { #( #(#field_attrs)* - #field_name: ::core::panic!(), + #field_name: loop {}, )* #zeroing_trailer }) |
