From: Petr Pavlu <petr.pavlu@suse.com>
To: Alvin Sun <alvin.sun@linux.dev>
Cc: "Miguel Ojeda" <ojeda@kernel.org>,
"Boqun Feng" <boqun@kernel.org>, "Gary Guo" <gary@garyguo.net>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Benno Lossin" <lossin@kernel.org>,
"Andreas Hindborg" <a.hindborg@kernel.org>,
"Alice Ryhl" <aliceryhl@google.com>,
"Trevor Gross" <tmgross@umich.edu>,
"Danilo Krummrich" <dakr@kernel.org>,
"Luis Chamberlain" <mcgrof@kernel.org>,
"Daniel Gomez" <da.gomez@kernel.org>,
"Sami Tolvanen" <samitolvanen@google.com>,
"Aaron Tomlin" <atomlin@atomlin.com>,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
"Rafael J. Wysocki" <rafael@kernel.org>,
"David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Daniel Almeida" <daniel.almeida@collabora.com>,
"Arnd Bergmann" <arnd@arndb.de>,
"Brendan Higgins" <brendan.higgins@linux.dev>,
"David Gow" <david@davidgow.net>,
"Rae Moar" <raemoar63@gmail.com>,
"Breno Leitao" <leitao@debian.org>,
"Jens Axboe" <axboe@kernel.dk>,
"Dave Ertman" <david.m.ertman@intel.com>,
"Leon Romanovsky" <leon@kernel.org>,
"Igor Korotin" <igor.korotin@linux.dev>,
"FUJITA Tomonori" <fujita.tomonori@gmail.com>,
"Bjorn Helgaas" <bhelgaas@google.com>,
"Krzysztof Wilczyński" <kwilczynski@kernel.org>,
"Arve Hjønnevåg" <arve@android.com>,
"Todd Kjos" <tkjos@android.com>,
"Christian Brauner" <brauner@kernel.org>,
"Carlos Llamas" <cmllamas@google.com>,
rust-for-linux@vger.kernel.org, linux-modules@vger.kernel.org,
driver-core@lists.linux.dev, dri-devel@lists.freedesktop.org,
nova-gpu@lists.linux.dev, linux-kselftest@vger.kernel.org,
kunit-dev@googlegroups.com, linux-block@vger.kernel.org,
linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
linux-pci@vger.kernel.org
Subject: Re: [PATCH v9 01/10] rust: module: move module types into `module.rs`
Date: Mon, 3 Aug 2026 10:58:59 +0200 [thread overview]
Message-ID: <30a7f47e-1937-44a0-b8cb-434e8b07ac2b@suse.com> (raw)
In-Reply-To: <20260723-fix-fops-owner-v9-1-c1c3af7f7bcb@linux.dev>
On 7/23/26 4:10 AM, Alvin Sun wrote:
> Move `Module`, `InPlaceModule`, `ModuleMetadata` and `ThisModule` from
> `lib.rs` into a new `rust/kernel/module.rs`. Re-export them from `lib.rs`
> to avoid tree-wide changes.
>
> Switch six bus driver registrations from `module.0` to the public
> `ThisModule::as_ptr()` accessor, since the field is no longer visible
> outside the new `module` submodule.
>
> No functional change.
>
> Assisted-by: opencode:glm-5.2
> Suggested-by: Gary Guo <gary@garyguo.net>
> Link: https://lore.kernel.org/all/DJFIQPLOVO4T.1K8T0VZM30LDA@garyguo.net/
> Reviewed-by: Gary Guo <gary@garyguo.net>
> Acked-by: Danilo Krummrich <dakr@kernel.org>
> Reviewed-by: Alice Ryhl <aliceryhl@google.com>
> Signed-off-by: Alvin Sun <alvin.sun@linux.dev>
Acked-by: Petr Pavlu <petr.pavlu@suse.com>
> ---
> rust/kernel/auxiliary.rs | 2 +-
> rust/kernel/i2c.rs | 2 +-
> rust/kernel/lib.rs | 75 +++++-------------------------------------------
> rust/kernel/module.rs | 71 +++++++++++++++++++++++++++++++++++++++++++++
> rust/kernel/net/phy.rs | 6 +++-
> rust/kernel/pci.rs | 2 +-
> rust/kernel/platform.rs | 2 +-
> rust/kernel/usb.rs | 2 +-
> 8 files changed, 88 insertions(+), 74 deletions(-)
>
> diff --git a/rust/kernel/auxiliary.rs b/rust/kernel/auxiliary.rs
> index 93c0db1f66555..4a02f83240be3 100644
> --- a/rust/kernel/auxiliary.rs
> +++ b/rust/kernel/auxiliary.rs
> @@ -63,7 +63,7 @@ unsafe fn register(
>
> // SAFETY: `adrv` is guaranteed to be a valid `DriverType`.
> to_result(unsafe {
> - bindings::__auxiliary_driver_register(adrv.get(), module.0, name.as_char_ptr())
> + bindings::__auxiliary_driver_register(adrv.get(), module.as_ptr(), name.as_char_ptr())
> })
> }
>
> diff --git a/rust/kernel/i2c.rs b/rust/kernel/i2c.rs
> index 7b908f0c5a58d..24eff08f47123 100644
> --- a/rust/kernel/i2c.rs
> +++ b/rust/kernel/i2c.rs
> @@ -142,7 +142,7 @@ unsafe fn register(
> }
>
> // SAFETY: `idrv` is guaranteed to be a valid `DriverType`.
> - to_result(unsafe { bindings::i2c_register_driver(module.0, idrv.get()) })
> + to_result(unsafe { bindings::i2c_register_driver(module.as_ptr(), idrv.get()) })
> }
>
> unsafe fn unregister(idrv: &Opaque<Self::DriverType>) {
> diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs
> index b72b2fbe046d6..040ae85056509 100644
> --- a/rust/kernel/lib.rs
> +++ b/rust/kernel/lib.rs
> @@ -93,6 +93,7 @@
> pub mod maple_tree;
> pub mod miscdevice;
> pub mod mm;
> +pub mod module;
> pub mod module_param;
> #[cfg(CONFIG_NET)]
> pub mod net;
> @@ -139,79 +140,17 @@
> #[doc(hidden)]
> pub use bindings;
> pub use macros;
> +pub use module::{
> + InPlaceModule,
> + Module,
> + ModuleMetadata,
> + ThisModule, //
> +};
> pub use uapi;
>
> /// Prefix to appear before log messages printed from within the `kernel` crate.
> const __LOG_PREFIX: &[u8] = b"rust_kernel\0";
>
> -/// The top level entrypoint to implementing a kernel module.
> -///
> -/// For any teardown or cleanup operations, your type may implement [`Drop`].
> -pub trait Module: Sized + Sync + Send {
> - /// Called at module initialization time.
> - ///
> - /// Use this method to perform whatever setup or registration your module
> - /// should do.
> - ///
> - /// Equivalent to the `module_init` macro in the C API.
> - fn init(module: &'static ThisModule) -> error::Result<Self>;
> -}
> -
> -/// A module that is pinned and initialised in-place.
> -pub trait InPlaceModule: Sync + Send {
> - /// Creates an initialiser for the module.
> - ///
> - /// It is called when the module is loaded.
> - fn init(module: &'static ThisModule) -> impl pin_init::PinInit<Self, error::Error>;
> -}
> -
> -impl<T: Module> InPlaceModule for T {
> - fn init(module: &'static ThisModule) -> impl pin_init::PinInit<Self, error::Error> {
> - let initer = move |slot: *mut Self| {
> - let m = <Self as Module>::init(module)?;
> -
> - // SAFETY: `slot` is valid for write per the contract with `pin_init_from_closure`.
> - unsafe { slot.write(m) };
> - Ok(())
> - };
> -
> - // SAFETY: On success, `initer` always fully initialises an instance of `Self`.
> - unsafe { pin_init::pin_init_from_closure(initer) }
> - }
> -}
> -
> -/// Metadata attached to a [`Module`] or [`InPlaceModule`].
> -pub trait ModuleMetadata {
> - /// The name of the module as specified in the `module!` macro.
> - const NAME: &'static crate::str::CStr;
> -}
> -
> -/// Equivalent to `THIS_MODULE` in the C API.
> -///
> -/// C header: [`include/linux/init.h`](srctree/include/linux/init.h)
> -pub struct ThisModule(*mut bindings::module);
> -
> -// SAFETY: `THIS_MODULE` may be used from all threads within a module.
> -unsafe impl Sync for ThisModule {}
> -
> -impl ThisModule {
> - /// Creates a [`ThisModule`] given the `THIS_MODULE` pointer.
> - ///
> - /// # Safety
> - ///
> - /// The pointer must be equal to the right `THIS_MODULE`.
> - pub const unsafe fn from_ptr(ptr: *mut bindings::module) -> ThisModule {
> - ThisModule(ptr)
> - }
> -
> - /// Access the raw pointer for this module.
> - ///
> - /// It is up to the user to use it correctly.
> - pub const fn as_ptr(&self) -> *mut bindings::module {
> - self.0
> - }
> -}
> -
> #[cfg(not(testlib))]
> #[panic_handler]
> fn panic(info: &core::panic::PanicInfo<'_>) -> ! {
> diff --git a/rust/kernel/module.rs b/rust/kernel/module.rs
> new file mode 100644
> index 0000000000000..be242a82e86d2
> --- /dev/null
> +++ b/rust/kernel/module.rs
> @@ -0,0 +1,71 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +//! Module-related types and helpers.
> +
> +/// The entrypoint to implementing a kernel module.
> +///
> +/// For any teardown or cleanup operations, your type may implement [`Drop`].
> +pub trait Module: Sized + Sync + Send {
> + /// Called at module initialization time.
> + ///
> + /// Use this method to perform whatever setup or registration your module
> + /// should do.
> + ///
> + /// Equivalent to the `module_init` macro in the C API.
> + fn init(module: &'static ThisModule) -> crate::error::Result<Self>;
> +}
> +
> +/// A module that is pinned and initialised in-place.
> +pub trait InPlaceModule: Sync + Send {
> + /// Creates an initialiser for the module.
> + ///
> + /// It is called when the module is loaded.
> + fn init(module: &'static ThisModule) -> impl pin_init::PinInit<Self, crate::error::Error>;
> +}
> +
> +impl<T: Module> InPlaceModule for T {
> + fn init(module: &'static ThisModule) -> impl pin_init::PinInit<Self, crate::error::Error> {
> + let initer = move |slot: *mut Self| {
> + let m = <Self as Module>::init(module)?;
> +
> + // SAFETY: `slot` is valid for write per the contract with `pin_init_from_closure`.
> + unsafe { slot.write(m) };
> + Ok(())
> + };
> +
> + // SAFETY: On success, `initer` always fully initialises an instance of `Self`.
> + unsafe { pin_init::pin_init_from_closure(initer) }
> + }
> +}
> +
> +/// Metadata attached to a [`Module`] or [`InPlaceModule`].
> +pub trait ModuleMetadata {
> + /// The name of the module as specified in the `module!` macro.
> + const NAME: &'static crate::str::CStr;
> +}
> +
> +/// Equivalent to `THIS_MODULE` in the C API.
> +///
> +/// C header: [`include/linux/init.h`](srctree/include/linux/init.h)
> +pub struct ThisModule(*mut crate::bindings::module);
> +
> +// SAFETY: `THIS_MODULE` may be used from all threads within a module.
> +unsafe impl Sync for ThisModule {}
> +
> +impl ThisModule {
> + /// Creates a [`ThisModule`] given the `THIS_MODULE` pointer.
> + ///
> + /// # Safety
> + ///
> + /// The pointer must be equal to the right `THIS_MODULE`.
> + pub const unsafe fn from_ptr(ptr: *mut crate::bindings::module) -> ThisModule {
> + ThisModule(ptr)
> + }
> +
> + /// Access the raw pointer for this module.
> + ///
> + /// It is up to the user to use it correctly.
> + pub const fn as_ptr(&self) -> *mut crate::bindings::module {
> + self.0
> + }
> +}
> diff --git a/rust/kernel/net/phy.rs b/rust/kernel/net/phy.rs
> index 3ca99db5cccf2..8b7036b8fe480 100644
> --- a/rust/kernel/net/phy.rs
> +++ b/rust/kernel/net/phy.rs
> @@ -659,7 +659,11 @@ pub fn register(
> // the `drivers` slice are initialized properly. `drivers` will not be moved.
> // So it's just an FFI call.
> to_result(unsafe {
> - bindings::phy_drivers_register(drivers[0].0.get(), drivers.len().try_into()?, module.0)
> + bindings::phy_drivers_register(
> + drivers[0].0.get(),
> + drivers.len().try_into()?,
> + module.as_ptr(),
> + )
> })?;
> // INVARIANT: The `drivers` slice is successfully registered to the kernel via `phy_drivers_register`.
> Ok(Registration { drivers })
> diff --git a/rust/kernel/pci.rs b/rust/kernel/pci.rs
> index af74ddff6114d..916ed2cb6b70b 100644
> --- a/rust/kernel/pci.rs
> +++ b/rust/kernel/pci.rs
> @@ -86,7 +86,7 @@ unsafe fn register(
>
> // SAFETY: `pdrv` is guaranteed to be a valid `DriverType`.
> to_result(unsafe {
> - bindings::__pci_register_driver(pdrv.get(), module.0, name.as_char_ptr())
> + bindings::__pci_register_driver(pdrv.get(), module.as_ptr(), name.as_char_ptr())
> })
> }
>
> diff --git a/rust/kernel/platform.rs b/rust/kernel/platform.rs
> index 8917d4ee499fb..9fdbafd53bc21 100644
> --- a/rust/kernel/platform.rs
> +++ b/rust/kernel/platform.rs
> @@ -82,7 +82,7 @@ unsafe fn register(
> }
>
> // SAFETY: `pdrv` is guaranteed to be a valid `DriverType`.
> - to_result(unsafe { bindings::__platform_driver_register(pdrv.get(), module.0) })
> + to_result(unsafe { bindings::__platform_driver_register(pdrv.get(), module.as_ptr()) })
> }
>
> unsafe fn unregister(pdrv: &Opaque<Self::DriverType>) {
> diff --git a/rust/kernel/usb.rs b/rust/kernel/usb.rs
> index 9c17a672cd275..213db32727c17 100644
> --- a/rust/kernel/usb.rs
> +++ b/rust/kernel/usb.rs
> @@ -63,7 +63,7 @@ unsafe fn register(
>
> // SAFETY: `udrv` is guaranteed to be a valid `DriverType`.
> to_result(unsafe {
> - bindings::usb_register_driver(udrv.get(), module.0, name.as_char_ptr())
> + bindings::usb_register_driver(udrv.get(), module.as_ptr(), name.as_char_ptr())
> })
> }
>
>
next prev parent reply other threads:[~2026-08-03 8:59 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-23 2:10 [PATCH v9 00/10] Fix missing fops.owner in Rust DRM/misc abstractions Alvin Sun
2026-07-23 2:10 ` [PATCH v9 01/10] rust: module: move module types into `module.rs` Alvin Sun
2026-08-03 8:58 ` Petr Pavlu [this message]
2026-07-23 2:10 ` [PATCH v9 02/10] rust: module: add `THIS_MODULE` const to `ModuleMetadata` trait Alvin Sun
2026-08-03 9:00 ` Petr Pavlu
2026-07-23 2:10 ` [PATCH v9 03/10] rust: doctest: add LocalModule fallback for #[vtable] ThisModule Alvin Sun
2026-07-23 2:10 ` [PATCH v9 04/10] rust: macros: auto-insert OwnerModule in #[vtable] Alvin Sun
2026-07-23 2:10 ` [PATCH v9 05/10] rust: drm: set fops.owner from driver module pointer Alvin Sun
2026-07-23 2:10 ` [PATCH v9 06/10] rust: miscdevice: " Alvin Sun
2026-07-23 2:10 ` [PATCH v9 07/10] rust: configfs: use `LocalModule` for `THIS_MODULE` Alvin Sun
2026-07-23 2:10 ` [PATCH v9 08/10] rust_binder: " Alvin Sun
2026-07-23 2:10 ` [PATCH v9 09/10] rust: macros: remove `THIS_MODULE` static from `module!` Alvin Sun
2026-08-03 9:01 ` Petr Pavlu
2026-07-23 2:10 ` [PATCH v9 10/10] rust: module: update MAINTAINERS to cover module.rs Alvin Sun
2026-08-03 8:54 ` Petr Pavlu
2026-07-28 8:38 ` [PATCH v9 00/10] Fix missing fops.owner in Rust DRM/misc abstractions Alvin Sun
2026-07-31 6:29 ` Miguel Ojeda
2026-08-03 9:10 ` Petr Pavlu
2026-07-31 6:46 ` Miguel Ojeda
2026-07-31 16:34 ` Alvin Sun
2026-07-31 16:43 ` Gary Guo
2026-07-31 16:57 ` Alvin Sun
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=30a7f47e-1937-44a0-b8cb-434e8b07ac2b@suse.com \
--to=petr.pavlu@suse.com \
--cc=a.hindborg@kernel.org \
--cc=airlied@gmail.com \
--cc=aliceryhl@google.com \
--cc=alvin.sun@linux.dev \
--cc=arnd@arndb.de \
--cc=arve@android.com \
--cc=atomlin@atomlin.com \
--cc=axboe@kernel.dk \
--cc=bhelgaas@google.com \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun@kernel.org \
--cc=brauner@kernel.org \
--cc=brendan.higgins@linux.dev \
--cc=cmllamas@google.com \
--cc=da.gomez@kernel.org \
--cc=dakr@kernel.org \
--cc=daniel.almeida@collabora.com \
--cc=david.m.ertman@intel.com \
--cc=david@davidgow.net \
--cc=dri-devel@lists.freedesktop.org \
--cc=driver-core@lists.linux.dev \
--cc=fujita.tomonori@gmail.com \
--cc=gary@garyguo.net \
--cc=gregkh@linuxfoundation.org \
--cc=igor.korotin@linux.dev \
--cc=kunit-dev@googlegroups.com \
--cc=kwilczynski@kernel.org \
--cc=leitao@debian.org \
--cc=leon@kernel.org \
--cc=linux-block@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-modules@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=lossin@kernel.org \
--cc=mcgrof@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=nova-gpu@lists.linux.dev \
--cc=ojeda@kernel.org \
--cc=raemoar63@gmail.com \
--cc=rafael@kernel.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=samitolvanen@google.com \
--cc=simona@ffwll.ch \
--cc=tkjos@android.com \
--cc=tmgross@umich.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox