diff options
| author | Gary Guo <gary@garyguo.net> | 2026-05-08 18:29:49 +0300 |
|---|---|---|
| committer | Gary Guo <gary@garyguo.net> | 2026-05-29 23:58:36 +0300 |
| commit | d2f309227952e73966682f348161094e40eb6440 (patch) | |
| tree | 2a4e1fe10031ddedc5a3356e989a692d78635675 /include/linux/debugobjects.h | |
| parent | f85906616ec70d1d0178073b16ebd1c7f6ff1ee7 (diff) | |
| download | linux-d2f309227952e73966682f348161094e40eb6440.tar.xz | |
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 'include/linux/debugobjects.h')
0 files changed, 0 insertions, 0 deletions
