* [PATCH] rust: export zerocopy symbols to modules
@ 2026-07-08 10:37 Alexandre Courbot
2026-07-08 10:50 ` Miguel Ojeda
2026-07-08 11:34 ` Gary Guo
0 siblings, 2 replies; 6+ messages in thread
From: Alexandre Courbot @ 2026-07-08 10:37 UTC (permalink / raw)
To: Miguel Ojeda, Boqun Feng, Gary Guo, Björn Roy Baron,
Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross,
Danilo Krummrich, Daniel Almeida, Tamir Duberstein,
Onur Özkan
Cc: rust-for-linux, linux-kernel, Alexandre Courbot
Non-generic, non-inlined functions of the `zerocopy` crate are only
codegen'd into `zerocopy.o`, with their symbols currently not exported,
making them unavailable to loadable modules.
This can break e.g. nova-core built as a module when
`CONFIG_CC_OPTIMIZE_FOR_SIZE=y`:
ERROR: modpost: "_RNvMNtCs5wX7wwEUCR9_8zerocopy6layoutNtB2_8SizeInfo24try_to_nonzero_elem_size" [drivers/gpu/nova-core.ko] undefined!
ERROR: modpost: "_RNvNtCs5wX7wwEUCR9_8zerocopy4util18padding_needed_for" [drivers/gpu/nova-core.ko] undefined!
Fix this by generating and including exports for `zerocopy.o`, similarly
to what is already done for `kernel.o`. All defined symbols (~12 in
total) are exported since the compiler gives no guarantee as to which
functions are codegen'd.
Signed-off-by: Alexandre Courbot <acourbot@nvidia.com>
---
My `CONFIG_CC_OPTIMIZE_FOR_SIZE=y` config is uncovering the most
interesting bugs. :) This one was revealed after applying [1].
I am not a build system expert at all, so be aware that the patch is
mostly mimicking what I am seeing for the kernel crate and there might
be a better way.
[1] https://lore.kernel.org/20260702120324.40388-4-niyudi.honda@gmail.com
---
rust/Makefile | 4 ++++
rust/exports.c | 1 +
2 files changed, 5 insertions(+)
diff --git a/rust/Makefile b/rust/Makefile
index a870d1616c71..65170c6d31a4 100644
--- a/rust/Makefile
+++ b/rust/Makefile
@@ -7,6 +7,7 @@ obj-$(CONFIG_RUST) += core.o compiler_builtins.o ffi.o
always-$(CONFIG_RUST) += exports_core_generated.h
obj-$(CONFIG_RUST) += zerocopy.o
+always-$(CONFIG_RUST) += exports_zerocopy_generated.h
ifdef CONFIG_RUST_INLINE_HELPERS
always-$(CONFIG_RUST) += helpers/helpers.bc helpers/helpers_module.bc
@@ -566,6 +567,9 @@ $(obj)/exports_bindings_generated.h: $(obj)/bindings.o FORCE
$(obj)/exports_kernel_generated.h: $(obj)/kernel.o FORCE
$(call if_changed,exports)
+$(obj)/exports_zerocopy_generated.h: $(obj)/zerocopy.o FORCE
+ $(call if_changed,exports)
+
quiet_cmd_rustc_procmacrolibrary = $(if $(skip_clippy),RUSTC,$(RUSTC_OR_CLIPPY_QUIET)) PL $@
cmd_rustc_procmacrolibrary = \
$(rustc_target_envs) \
diff --git a/rust/exports.c b/rust/exports.c
index 1b52460b0f4e..a9d6be8e8485 100644
--- a/rust/exports.c
+++ b/rust/exports.c
@@ -18,6 +18,7 @@
#include "exports_core_generated.h"
#include "exports_bindings_generated.h"
#include "exports_kernel_generated.h"
+#include "exports_zerocopy_generated.h"
#ifndef CONFIG_RUST_INLINE_HELPERS
#include "exports_helpers_generated.h"
---
base-commit: dc59e4fea9d83f03bad6bddf3fa2e52491777482
change-id: 20260708-zerocopy-export-e6d29c42386c
Best regards,
--
Alexandre Courbot <acourbot@nvidia.com>
^ permalink raw reply related [flat|nested] 6+ messages in thread* Re: [PATCH] rust: export zerocopy symbols to modules 2026-07-08 10:37 [PATCH] rust: export zerocopy symbols to modules Alexandre Courbot @ 2026-07-08 10:50 ` Miguel Ojeda 2026-07-08 11:34 ` Gary Guo 1 sibling, 0 replies; 6+ messages in thread From: Miguel Ojeda @ 2026-07-08 10:50 UTC (permalink / raw) To: Alexandre Courbot Cc: Miguel Ojeda, Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross, Danilo Krummrich, Daniel Almeida, Tamir Duberstein, Onur Özkan, rust-for-linux, linux-kernel On Wed, Jul 8, 2026 at 12:37 PM Alexandre Courbot <acourbot@nvidia.com> wrote: > > Non-generic, non-inlined functions of the `zerocopy` crate are only > codegen'd into `zerocopy.o`, with their symbols currently not exported, > making them unavailable to loadable modules. Ah, in that case, yeah, we definitely need this. > My `CONFIG_CC_OPTIMIZE_FOR_SIZE=y` config is uncovering the most > interesting bugs. :) This one was revealed after applying [1]. Yeah, it is a bit painful. I will add it to my set. > I am not a build system expert at all, so be aware that the patch is No one really is... :) (Unless you are named Masahiro!) I think I will route this one via `rust-fixes`. Cheers, Miguel ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] rust: export zerocopy symbols to modules 2026-07-08 10:37 [PATCH] rust: export zerocopy symbols to modules Alexandre Courbot 2026-07-08 10:50 ` Miguel Ojeda @ 2026-07-08 11:34 ` Gary Guo 2026-07-08 11:37 ` Miguel Ojeda 2026-07-08 11:51 ` Gary Guo 1 sibling, 2 replies; 6+ messages in thread From: Gary Guo @ 2026-07-08 11:34 UTC (permalink / raw) To: Alexandre Courbot, Miguel Ojeda, Boqun Feng, Gary Guo, Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross, Danilo Krummrich, Daniel Almeida, Tamir Duberstein, Onur Özkan Cc: rust-for-linux, linux-kernel On Wed Jul 8, 2026 at 11:37 AM BST, Alexandre Courbot wrote: > Non-generic, non-inlined functions of the `zerocopy` crate are only > codegen'd into `zerocopy.o`, with their symbols currently not exported, > making them unavailable to loadable modules. > > This can break e.g. nova-core built as a module when > `CONFIG_CC_OPTIMIZE_FOR_SIZE=y`: > > ERROR: modpost: "_RNvMNtCs5wX7wwEUCR9_8zerocopy6layoutNtB2_8SizeInfo24try_to_nonzero_elem_size" [drivers/gpu/nova-core.ko] undefined! > ERROR: modpost: "_RNvNtCs5wX7wwEUCR9_8zerocopy4util18padding_needed_for" [drivers/gpu/nova-core.ko] undefined! It looks to me that this should be done by fixing zerocopy. Both these functions should be marked as `#[inline]`. I would expect zerocopy.o to be having no .text. Instead of exporting this, I would vouch for going to another extreme -- completely leave zerocopy.o unlinked, so we catch cases where code is actually generated. Best, Gary > > Fix this by generating and including exports for `zerocopy.o`, similarly > to what is already done for `kernel.o`. All defined symbols (~12 in > total) are exported since the compiler gives no guarantee as to which > functions are codegen'd. > > Signed-off-by: Alexandre Courbot <acourbot@nvidia.com> > --- > My `CONFIG_CC_OPTIMIZE_FOR_SIZE=y` config is uncovering the most > interesting bugs. :) This one was revealed after applying [1]. > > I am not a build system expert at all, so be aware that the patch is > mostly mimicking what I am seeing for the kernel crate and there might > be a better way. > > [1] https://lore.kernel.org/20260702120324.40388-4-niyudi.honda@gmail.com > --- > rust/Makefile | 4 ++++ > rust/exports.c | 1 + > 2 files changed, 5 insertions(+) ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] rust: export zerocopy symbols to modules 2026-07-08 11:34 ` Gary Guo @ 2026-07-08 11:37 ` Miguel Ojeda [not found] ` <CAPvrYMF3L0x5PBJk2TnSPyi0Lci2H0vGBu6QS_Rm4XFQtTV6mw@mail.gmail.com> 2026-07-08 11:51 ` Gary Guo 1 sibling, 1 reply; 6+ messages in thread From: Miguel Ojeda @ 2026-07-08 11:37 UTC (permalink / raw) To: Gary Guo, Joshua Liebow-Feeser, Jack Wrenn Cc: Alexandre Courbot, Miguel Ojeda, Boqun Feng, Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross, Danilo Krummrich, Daniel Almeida, Tamir Duberstein, Onur Özkan, rust-for-linux, linux-kernel On Wed, Jul 8, 2026 at 1:34 PM Gary Guo <gary@garyguo.net> wrote: > > It looks to me that this should be done by fixing zerocopy. > > Both these functions should be marked as `#[inline]`. I would expect zerocopy.o > to be having no .text. > > Instead of exporting this, I would vouch for going to another extreme -- > completely leave zerocopy.o unlinked, so we catch cases where code is actually > generated. Cc'ing Joshua and Jack -- context here: https://lore.kernel.org/rust-for-linux/20260708-zerocopy-export-v1-1-2bfc355853c6@nvidia.com/ Cheers, Miguel ^ permalink raw reply [flat|nested] 6+ messages in thread
[parent not found: <CAPvrYMF3L0x5PBJk2TnSPyi0Lci2H0vGBu6QS_Rm4XFQtTV6mw@mail.gmail.com>]
* Re: [PATCH] rust: export zerocopy symbols to modules [not found] ` <CAPvrYMF3L0x5PBJk2TnSPyi0Lci2H0vGBu6QS_Rm4XFQtTV6mw@mail.gmail.com> @ 2026-07-08 16:23 ` Miguel Ojeda 0 siblings, 0 replies; 6+ messages in thread From: Miguel Ojeda @ 2026-07-08 16:23 UTC (permalink / raw) To: Joshua Liebow-Feeser Cc: Gary Guo, Jack Wrenn, Alexandre Courbot, Miguel Ojeda, Boqun Feng, Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross, Danilo Krummrich, Daniel Almeida, Tamir Duberstein, Onur Özkan, rust-for-linux, linux-kernel On Wed, Jul 8, 2026 at 5:35 PM Joshua Liebow-Feeser <joshlf@google.com> wrote: > > What's the list of symbols that you'd like to be marked `#[inline]`? It'd be easy for us to add that upstream. Thanks for the reply! Gary sent a reply here: https://lore.kernel.org/rust-for-linux/DJT6235B3DOV.222XR5O6VHG4M@garyguo.net/ Cheers, Miguel ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] rust: export zerocopy symbols to modules 2026-07-08 11:34 ` Gary Guo 2026-07-08 11:37 ` Miguel Ojeda @ 2026-07-08 11:51 ` Gary Guo 1 sibling, 0 replies; 6+ messages in thread From: Gary Guo @ 2026-07-08 11:51 UTC (permalink / raw) To: Gary Guo, Alexandre Courbot, Miguel Ojeda, Boqun Feng, Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross, Danilo Krummrich, Daniel Almeida, Tamir Duberstein, Onur Özkan Cc: rust-for-linux, linux-kernel On Wed Jul 8, 2026 at 12:34 PM BST, Gary Guo wrote: > On Wed Jul 8, 2026 at 11:37 AM BST, Alexandre Courbot wrote: >> Non-generic, non-inlined functions of the `zerocopy` crate are only >> codegen'd into `zerocopy.o`, with their symbols currently not exported, >> making them unavailable to loadable modules. >> >> This can break e.g. nova-core built as a module when >> `CONFIG_CC_OPTIMIZE_FOR_SIZE=y`: >> >> ERROR: modpost: "_RNvMNtCs5wX7wwEUCR9_8zerocopy6layoutNtB2_8SizeInfo24try_to_nonzero_elem_size" [drivers/gpu/nova-core.ko] undefined! >> ERROR: modpost: "_RNvNtCs5wX7wwEUCR9_8zerocopy4util18padding_needed_for" [drivers/gpu/nova-core.ko] undefined! > > It looks to me that this should be done by fixing zerocopy. > > Both these functions should be marked as `#[inline]`. I would expect zerocopy.o > to be having no .text. > > Instead of exporting this, I would vouch for going to another extreme -- > completely leave zerocopy.o unlinked, so we catch cases where code is actually > generated. > > Best, > Gary > This should do the trick. The only other unexported symbols are f32_ext and f64_ext, which we never use. We can mark them as `#[inline(always)]` as well, but figuring out how to compile them out completely might be better. diff --git a/rust/Makefile b/rust/Makefile index a870d1616c71..98c6086342a7 100644 --- a/rust/Makefile +++ b/rust/Makefile @@ -6,7 +6,7 @@ rustdoc_output := $(objtree)/Documentation/output/rust/rustdoc obj-$(CONFIG_RUST) += core.o compiler_builtins.o ffi.o always-$(CONFIG_RUST) += exports_core_generated.h -obj-$(CONFIG_RUST) += zerocopy.o +always-$(CONFIG_RUST) += zerocopy.o ifdef CONFIG_RUST_INLINE_HELPERS always-$(CONFIG_RUST) += helpers/helpers.bc helpers/helpers_module.bc diff --git a/rust/zerocopy/src/layout.rs b/rust/zerocopy/src/layout.rs index 6015d0f2de52..1870363adf10 100644 --- a/rust/zerocopy/src/layout.rs +++ b/rust/zerocopy/src/layout.rs @@ -71,6 +71,7 @@ impl SizeInfo { /// Attempts to create a `SizeInfo` from `Self` in which `elem_size` is a /// `NonZeroUsize`. If `elem_size` is 0, returns `None`. #[allow(unused)] + #[inline(always)] const fn try_to_nonzero_elem_size(&self) -> Option<SizeInfo<NonZeroUsize>> { Some(match *self { SizeInfo::Sized { size } => SizeInfo::Sized { size }, diff --git a/rust/zerocopy/src/util/mod.rs b/rust/zerocopy/src/util/mod.rs index d6d4c6c2fcd9..ceffe8b5510d 100644 --- a/rust/zerocopy/src/util/mod.rs +++ b/rust/zerocopy/src/util/mod.rs @@ -150,6 +150,7 @@ pub(crate) fn validate_aligned_to<T: AsAddress, U>(t: T) -> Result<(), Alignment // Ensures that we add the minimum required padding. kani::ensures(|&p| p < align.get()), )] +#[inline(always)] pub(crate) const fn padding_needed_for(len: usize, align: NonZeroUsize) -> usize { #[cfg(kani)] #[kani::proof_for_contract(padding_needed_for)] @@ -251,6 +252,7 @@ fn proof() { n & mask } +#[inline(always)] pub(crate) const fn max(a: NonZeroUsize, b: NonZeroUsize) -> NonZeroUsize { if a.get() < b.get() { b @@ -259,6 +261,7 @@ pub(crate) const fn max(a: NonZeroUsize, b: NonZeroUsize) -> NonZeroUsize { } } +#[inline(always)] pub(crate) const fn min(a: NonZeroUsize, b: NonZeroUsize) -> NonZeroUsize { if a.get() > b.get() { b ^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2026-07-08 16:23 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-08 10:37 [PATCH] rust: export zerocopy symbols to modules Alexandre Courbot
2026-07-08 10:50 ` Miguel Ojeda
2026-07-08 11:34 ` Gary Guo
2026-07-08 11:37 ` Miguel Ojeda
[not found] ` <CAPvrYMF3L0x5PBJk2TnSPyi0Lci2H0vGBu6QS_Rm4XFQtTV6mw@mail.gmail.com>
2026-07-08 16:23 ` Miguel Ojeda
2026-07-08 11:51 ` Gary Guo
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox