| From 1b6170ff7a203a5e8354f19b7839fe8b897a9c0d Mon Sep 17 00:00:00 2001 |
| From: Thomas Bertschinger <tahbertschinger@gmail.com> |
| Date: Tue, 6 Feb 2024 08:38:06 -0700 |
| Subject: rust: module: place generated init_module() function in .init.text |
| |
| From: Thomas Bertschinger <tahbertschinger@gmail.com> |
| |
| commit 1b6170ff7a203a5e8354f19b7839fe8b897a9c0d upstream. |
| |
| Currently Rust kernel modules have their init code placed in the `.text` |
| section of the .ko file. I don't think this causes any real problems |
| for Rust modules as long as all code called during initialization lives |
| in `.text`. |
| |
| However, if a Rust `init_module()` function (that lives in `.text`) |
| calls a function marked with `__init` (in C) or |
| `#[link_section = ".init.text"]` (in Rust), then a warning is |
| generated by modpost because that function lives in `.init.text`. |
| For example: |
| |
| WARNING: modpost: fs/bcachefs/bcachefs: section mismatch in reference: init_module+0x6 (section: .text) -> _RNvXCsj7d3tFpT5JS_15bcachefs_moduleNtB2_8BcachefsNtCsjDtqRIL3JAG_6kernel6Module4init (section: .init.text) |
| |
| I ran into this while experimenting with converting the bcachefs kernel |
| module from C to Rust. The module's `init()`, written in Rust, calls C |
| functions like `bch2_vfs_init()` which are placed in `.init.text`. |
| |
| This patch places the macro-generated `init_module()` Rust function in |
| the `.init.text` section. It also marks `init_module()` as unsafe--now |
| it may not be called after module initialization completes because it |
| may be freed already. |
| |
| Note that this is not enough on its own to actually get all the module |
| initialization code in that section. The module author must still add |
| the `#[link_section = ".init.text"]` attribute to the Rust `init()` in |
| the `impl kernel::Module` block in order to then call `__init` |
| functions. However, this patch enables module authors do so, when |
| previously it would not be possible (without warnings). |
| |
| Signed-off-by: Thomas Bertschinger <tahbertschinger@gmail.com> |
| Reviewed-by: Martin Rodriguez Reboredo <yakoyoku@gmail.com> |
| Reviewed-by: Alice Ryhl <aliceryhl@google.com> |
| Link: https://lore.kernel.org/r/20240206153806.567055-1-tahbertschinger@gmail.com |
| [ Reworded title to add prefix. ] |
| Signed-off-by: Miguel Ojeda <ojeda@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| rust/macros/module.rs | 7 ++++++- |
| 1 file changed, 6 insertions(+), 1 deletion(-) |
| |
| --- a/rust/macros/module.rs |
| +++ b/rust/macros/module.rs |
| @@ -202,10 +202,15 @@ pub(crate) fn module(ts: TokenStream) -> |
| }}; |
| |
| // Loadable modules need to export the `{{init,cleanup}}_module` identifiers. |
| + /// # Safety |
| + /// |
| + /// This function must not be called after module initialization, because it may be |
| + /// freed after that completes. |
| #[cfg(MODULE)] |
| #[doc(hidden)] |
| #[no_mangle] |
| - pub extern \"C\" fn init_module() -> core::ffi::c_int {{ |
| + #[link_section = \".init.text\"] |
| + pub unsafe extern \"C\" fn init_module() -> core::ffi::c_int {{ |
| __init() |
| }} |
| |