Patch "rust: module: place generated init_module() function in .init.text" has been added to the 6.8-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    rust: module: place generated init_module() function in .init.text

to the 6.8-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     rust-module-place-generated-init_module-function-in-.patch
and it can be found in the queue-6.8 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 8a3f314b75643431052edd923a52af28a7a92413
Author: Thomas Bertschinger <tahbertschinger@xxxxxxxxx>
Date:   Tue Feb 6 08:38:06 2024 -0700

    rust: module: place generated init_module() function in .init.text
    
    [ Upstream commit 1b6170ff7a203a5e8354f19b7839fe8b897a9c0d ]
    
    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@xxxxxxxxx>
    Reviewed-by: Martin Rodriguez Reboredo <yakoyoku@xxxxxxxxx>
    Reviewed-by: Alice Ryhl <aliceryhl@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20240206153806.567055-1-tahbertschinger@xxxxxxxxx
    [ Reworded title to add prefix. ]
    Signed-off-by: Miguel Ojeda <ojeda@xxxxxxxxxx>
    Stable-dep-of: 7044dcff8301 ("rust: macros: fix soundness issue in `module!` macro")
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/rust/macros/module.rs b/rust/macros/module.rs
index d62d8710d77ab..27979e582e4b9 100644
--- a/rust/macros/module.rs
+++ b/rust/macros/module.rs
@@ -222,10 +222,15 @@ pub(crate) fn module(ts: TokenStream) -> 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()
             }}
 




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux