From nobody Mon Feb 9 06:34:31 2026 Received: from mail-lj1-f172.google.com (mail-lj1-f172.google.com [209.85.208.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0FADF25B1DA for ; Thu, 1 Jan 2026 05:21:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767244920; cv=none; b=N066i50/0JK07pkBQZcGcrIywn2Z0WJHCRcDoiwkmnlWM4/JqXEFKFjxaKqEysgF3oGg/TBmzjkP2kJ7Pj/m83bRq7fwUYA6PXp5IeY9ovwxzsvhF0cCAT6535UnoyNOYnsQ4kXKMWDoiqvQMMMNkrlkjzMX0hO0dB8LPkqrpmM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767244920; c=relaxed/simple; bh=KJQ4jpYSGm/3nhZ2nBbnbAiByofjpfGBkERW9T5CzMA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=oynhBpqpbeJPQNkK1XaZTEHfJGJuzEpvhM9V7A4F5sbr2UDvjtbQtRjnfW92hty46RlzQ4wnhPl3/nYdFYFmLq7qb/uHNS1nhMszuYT8i3EOig9m5fC1qbTCPVf+uaiaMIyTXkpJcwrqZafhOM9KtpD4CNV/t5CSbJ2BeGqRJO0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=W8SfiUOG; arc=none smtp.client-ip=209.85.208.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="W8SfiUOG" Received: by mail-lj1-f172.google.com with SMTP id 38308e7fff4ca-3825ae23d95so37403411fa.0 for ; Wed, 31 Dec 2025 21:21:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1767244915; x=1767849715; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=MCtaSXGPRcSbvYyqIPMnOeQLbklJUshA1S2PP0SMOWU=; b=W8SfiUOGab+mVjvrfzk/33yX079OgglDKXsquQVI4bjSwr+NAIphOQ0dPWEtcKwQKV r9dTZCKw6pGWEFFXMx94XhpTfWhzQxpRm6XioKypGjKEwBN8iLy5T47VmVhUnJhJkQtO NcKB4R2tZ8xKqChT2UM4L73ojVXqVowPSooi3o38YYfX6iLdZJmouPQtzNyDJKK+z7/U 0iEkcoq3an+DuQJsqdR35jpX/vF+D3kf3lzaBFqm3J1z0hmF/3tjv0fu75O/ZnHIeB86 /nLMvgzM1NjXKUdz3deG9NXgRCVNitauHN0OLSDh5z/r9fP98m+A7+SKpbOnd4gNsOW0 mAtg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767244915; x=1767849715; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=MCtaSXGPRcSbvYyqIPMnOeQLbklJUshA1S2PP0SMOWU=; b=s4V678y0YIs8ACzu37uruhUFTWpfhMb6HbrZRB6O9tnElBmpecjLQKwGjwUu1jtwSX lUmNxSYRlJ9kdHsGyWqhISa7wtuCaoe3Ermr1ymIPE2pkaXTVEiErQNznlmrnzaZwaAR V/epRghLs2bolms4c/Yg44+X4dA9FuIbyFKuEqAcNEysieu7e5Z6f4JGhubbiYNw+g3F y7Hkyt1zaoFdwaemNSkwXSo8dDBStyLNMuo5DqdJhvM2uPYRB06kiAOB8s75PTAxrRy1 HR0Do5m7rSihOtStqmuzKE/KR3INtJSHF1iw+vhAkCvea9f09IWOYFkPvIiKx3r8ig0w 4zcQ== X-Forwarded-Encrypted: i=1; AJvYcCUYnXZbcaoVtzGKvUEYrEixtYM4R1Qo6/U2EjDVHX+KTYyex9EAYlczBJdsVqt8KH0YJ75mfn4REePx67Q=@vger.kernel.org X-Gm-Message-State: AOJu0YxrTiFq6XnXYtqvB42TacDnmlZYGH7jE6PrUxjnQ34co96XI5B9 lyWgVpnSdsN3gK7iSvyKndBE9oVb4Iqrggi5eLKBgkLt4m+4TpQNqUoo X-Gm-Gg: AY/fxX4mM7xdEKGW5gs+STywk3YASajNBSYBboIORg6qNC3iRwzvg5+MdK2b41GS/DK y/y1pCahNP0mahanIaofLjJHSSNtTuEzdrkqnuEmG/6Z95wH0cfFSanfx3tWuZz7W4prvdhPfqS p6Xafumn4agtZiS+TixPXpB4+gf3tpAy/rKIv1WDEUro7ylhVYjfh/Ogh9sF9VvjfcVR0toXv8H 1oLdUN/14pXrsu/jPd5Q7iujRji0x+5g4oFup5RNg1aelxdiRNwTJzwRyH6JpZl7QzAXhpIkGOf vUVXqmsGnsfdEUvrelVno63pbVDOFAWPtkFXmgG94cvUuVyFxW0QSN7iH+Rf1NcbgWNX/g4TWyQ Z89CGzbViLRFJBdGMT4JM1Q40uahxZd6eOWplA1F8JelDJnsXQzAlXd8jLk6nb57Dgq6DB5gR7P eAXlo3KjLYjjlJFIRxexw8BSAxzPncZ9l5rwp9rw7R+uPaugeHQKVpJgA9tkVaJwucYsmoFmqJg UM9iA== X-Google-Smtp-Source: AGHT+IE44rsnY6ipPrk3/J7X1yUoLY5WMocdogdmnIRKh23tOr7xkmlRQ6aQFRsTEn6UW4FJGOVNiA== X-Received: by 2002:a2e:a993:0:b0:382:b559:8336 with SMTP id 38308e7fff4ca-382b55983b4mr984331fa.22.1767244915067; Wed, 31 Dec 2025 21:21:55 -0800 (PST) Received: from LT-5CG5341NQ4.nordic.imtech.com (84-253-216-54.bb.dnainternet.fi. [84.253.216.54]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-382861ef4ccsm37064921fa.23.2025.12.31.21.21.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 31 Dec 2025 21:21:53 -0800 (PST) From: Kari Argillander Date: Thu, 01 Jan 2026 07:20:50 +0200 Subject: [PATCH RFC 6/6] rust: WIP: Replace ModuleMetadata with THIS_MODULE Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260101-this_module_fix-v1-6-46ae3e5605a0@gmail.com> References: <20260101-this_module_fix-v1-0-46ae3e5605a0@gmail.com> In-Reply-To: <20260101-this_module_fix-v1-0-46ae3e5605a0@gmail.com> To: Miguel Ojeda , Boqun Feng , Gary Guo , =?utf-8?q?Bj=C3=B6rn_Roy_Baron?= , Benno Lossin , Andreas Hindborg , Alice Ryhl , Trevor Gross , Danilo Krummrich , Alexandre Courbot Cc: Greg Kroah-Hartman , rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org, linux-modules@vger.kernel.org, Luis Chamberlain , Petr Pavlu , Daniel Gomez , Sami Tolvanen , Aaron Tomlin , Jens Axboe , Kari Argillander , Andreas Hindborg X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1767244881; l=13418; i=kari.argillander@gmail.com; s=20251219; h=from:subject:message-id; bh=KJQ4jpYSGm/3nhZ2nBbnbAiByofjpfGBkERW9T5CzMA=; b=gFUZ/58AraibpqH01HqbZhQb+XNzgNCXh3sNTjmMWxdx2lrddwUWZPbsMGPtHuo9cNjvK7Gnk 08Orxt2elZ7CXFWUsZAPrZSWyFOPO4sQv3P7Qixgg1aPs6qOQRb92/+ X-Developer-Key: i=kari.argillander@gmail.com; a=ed25519; pk=RwSxyhTpE3z4sywdDbIkC3q33ZQLNyhYWxT44iTY6r4= ModuleMetadata seems redudant after we have prober THIS_MODULE. --- drivers/gpu/nova-core/nova_core.rs | 2 +- rust/kernel/auxiliary.rs | 10 +++++++--- rust/kernel/driver.rs | 10 ++++------ rust/kernel/firmware.rs | 2 +- rust/kernel/i2c.rs | 4 ++-- rust/kernel/lib.rs | 8 ++------ rust/kernel/pci.rs | 6 +++--- rust/kernel/platform.rs | 4 ++-- rust/kernel/usb.rs | 6 +++--- rust/macros/module.rs | 13 +++++++------ samples/rust/rust_driver_auxiliary.rs | 6 +++--- 11 files changed, 35 insertions(+), 36 deletions(-) diff --git a/drivers/gpu/nova-core/nova_core.rs b/drivers/gpu/nova-core/nov= a_core.rs index b98a1c03f13d..fbfbcc9446c0 100644 --- a/drivers/gpu/nova-core/nova_core.rs +++ b/drivers/gpu/nova-core/nova_core.rs @@ -19,7 +19,7 @@ mod util; mod vbios; =20 -pub(crate) const MODULE_NAME: &kernel::str::CStr =3D ::NAME; +pub(crate) const MODULE_NAME: &kernel::str::CStr =3D THIS_MODULE::name(); =20 kernel::module_pci_driver! { type: driver::NovaCore, diff --git a/rust/kernel/auxiliary.rs b/rust/kernel/auxiliary.rs index 323074322505..bd064b677c05 100644 --- a/rust/kernel/auxiliary.rs +++ b/rust/kernel/auxiliary.rs @@ -27,10 +27,10 @@ unsafe impl driver::RegistrationOps for Adapter { type RegType =3D bindings::auxiliary_driver; =20 - unsafe fn register(adrv: &Opaque, name: = &'static CStr) -> Result { + unsafe fn register(adrv: &Opaque) -> Res= ult { // SAFETY: It's safe to set the fields of `struct auxiliary_driver= ` on initialization. unsafe { - (*adrv.get()).name =3D name.as_char_ptr(); + (*adrv.get()).name =3D M::NAME.as_char_ptr(); (*adrv.get()).probe =3D Some(Self::probe_callback); (*adrv.get()).remove =3D Some(Self::remove_callback); (*adrv.get()).id_table =3D T::ID_TABLE.as_ptr(); @@ -38,7 +38,11 @@ unsafe fn register(adrv: &Opaque, name: &'static C =20 // SAFETY: `adrv` is guaranteed to be a valid `RegType`. to_result(unsafe { - bindings::__auxiliary_driver_register(adrv.get(), M::OWNER.as_= ptr(), name.as_char_ptr()) + bindings::__auxiliary_driver_register( + adrv.get(), + M::OWNER.as_ptr(), + M::NAME.as_char_ptr(), + ) }) } =20 diff --git a/rust/kernel/driver.rs b/rust/kernel/driver.rs index 7c4ad24bb48a..5bb029075a57 100644 --- a/rust/kernel/driver.rs +++ b/rust/kernel/driver.rs @@ -118,7 +118,7 @@ pub unsafe trait RegistrationOps { /// /// On success, `reg` must remain pinned and valid until the matching = call to /// [`RegistrationOps::unregister`]. - unsafe fn register(reg: &Opaque, name: &= 'static CStr) -> Result; + unsafe fn register(reg: &Opaque) -> Resu= lt; =20 /// Unregisters a driver previously registered with [`RegistrationOps:= :register`]. /// @@ -151,7 +151,7 @@ unsafe impl Send for Registration {} =20 impl Registration { /// Creates a new instance of the registration object. - pub fn new(name: &'static CStr) -> impl PinInit { + pub fn new() -> impl PinInit { try_pin_init!(Self { reg <- Opaque::try_ffi_init(|ptr: *mut T::RegType| { // SAFETY: `try_ffi_init` guarantees that `ptr` is valid f= or write. @@ -162,7 +162,7 @@ pub fn new(name: &'static CStr) -> impl = PinInit { let drv =3D unsafe { &*(ptr as *const Opaque) = }; =20 // SAFETY: `drv` is guaranteed to be pinned until `T::unre= gister`. - unsafe { T::register::(drv, name) } + unsafe { T::register::(drv) } }), }) } @@ -195,9 +195,7 @@ struct DriverModule { impl $crate::InPlaceModule for DriverModule { fn init() -> impl ::pin_init::PinInit= { $crate::try_pin_init!(Self { - _driver <- $crate::driver::Registration::new::( - ::NAME, - ), + _driver <- $crate::driver::Registration::new::(), }) } } diff --git a/rust/kernel/firmware.rs b/rust/kernel/firmware.rs index 71168d8004e2..254b5c6b64af 100644 --- a/rust/kernel/firmware.rs +++ b/rust/kernel/firmware.rs @@ -206,7 +206,7 @@ macro_rules! module_firmware { const __MODULE_FIRMWARE_PREFIX: &'static $crate::str::CStr =3D= if cfg!(MODULE) { c"" } else { - ::NAME + THIS_MODULE::name() }; =20 #[link_section =3D ".modinfo"] diff --git a/rust/kernel/i2c.rs b/rust/kernel/i2c.rs index bc154506b16f..31db4d45bab1 100644 --- a/rust/kernel/i2c.rs +++ b/rust/kernel/i2c.rs @@ -97,7 +97,7 @@ macro_rules! i2c_device_table { unsafe impl driver::RegistrationOps for Adapter { type RegType =3D bindings::i2c_driver; =20 - unsafe fn register(idrv: &Opaque, name: = &'static CStr) -> Result { + unsafe fn register(idrv: &Opaque) -> Res= ult { build_assert!( T::ACPI_ID_TABLE.is_some() || T::OF_ID_TABLE.is_some() || T::I= 2C_ID_TABLE.is_some(), "At least one of ACPI/OF/Legacy tables must be present when re= gistering an i2c driver" @@ -120,7 +120,7 @@ unsafe fn register(idrv: &Opaque, name: &'static C =20 // SAFETY: It's safe to set the fields of `struct i2c_client` on i= nitialization. unsafe { - (*idrv.get()).driver.name =3D name.as_char_ptr(); + (*idrv.get()).driver.name =3D M::NAME.as_char_ptr(); (*idrv.get()).probe =3D Some(Self::probe_callback); (*idrv.get()).remove =3D Some(Self::remove_callback); (*idrv.get()).shutdown =3D Some(Self::shutdown_callback); diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs index 6d4563662a02..3bae80a949d2 100644 --- a/rust/kernel/lib.rs +++ b/rust/kernel/lib.rs @@ -199,12 +199,6 @@ fn init() -> impl pin_init::PinInit { } } =20 -/// 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; -} - pub mod this_module { //! TODO //! @@ -224,6 +218,8 @@ pub mod this_module { pub trait ThisModule { /// TODO Doc const OWNER: ModuleWrapper; + /// TODO Doc + const NAME: &'static kernel::str::CStr; } =20 /// See [`this_module`] diff --git a/rust/kernel/pci.rs b/rust/kernel/pci.rs index 792560ca8020..b043d7a388d0 100644 --- a/rust/kernel/pci.rs +++ b/rust/kernel/pci.rs @@ -54,10 +54,10 @@ unsafe impl driver::RegistrationOps for Adapter { type RegType =3D bindings::pci_driver; =20 - unsafe fn register(pdrv: &Opaque, name: = &'static CStr) -> Result { + unsafe fn register(pdrv: &Opaque) -> Res= ult { // SAFETY: It's safe to set the fields of `struct pci_driver` on i= nitialization. unsafe { - (*pdrv.get()).name =3D name.as_char_ptr(); + (*pdrv.get()).name =3D M::NAME.as_char_ptr(); (*pdrv.get()).probe =3D Some(Self::probe_callback); (*pdrv.get()).remove =3D Some(Self::remove_callback); (*pdrv.get()).id_table =3D T::ID_TABLE.as_ptr(); @@ -65,7 +65,7 @@ unsafe fn register(pdrv: &Opaque, name: &'static C =20 // SAFETY: `pdrv` is guaranteed to be a valid `RegType`. to_result(unsafe { - bindings::__pci_register_driver(pdrv.get(), M::OWNER.as_ptr(),= name.as_char_ptr()) + bindings::__pci_register_driver(pdrv.get(), M::OWNER.as_ptr(),= M::NAME.as_char_ptr()) }) } =20 diff --git a/rust/kernel/platform.rs b/rust/kernel/platform.rs index 67d46231600e..27f196a140e5 100644 --- a/rust/kernel/platform.rs +++ b/rust/kernel/platform.rs @@ -30,7 +30,7 @@ unsafe impl driver::RegistrationOps for Adapter { type RegType =3D bindings::platform_driver; =20 - unsafe fn register(pdrv: &Opaque, name: = &'static CStr) -> Result { + unsafe fn register(pdrv: &Opaque) -> Res= ult { let of_table =3D match T::OF_ID_TABLE { Some(table) =3D> table.as_ptr(), None =3D> core::ptr::null(), @@ -43,7 +43,7 @@ unsafe fn register(pdrv: &Opaque, name: &'static C =20 // SAFETY: It's safe to set the fields of `struct platform_driver`= on initialization. unsafe { - (*pdrv.get()).driver.name =3D name.as_char_ptr(); + (*pdrv.get()).driver.name =3D M::NAME.as_char_ptr(); (*pdrv.get()).probe =3D Some(Self::probe_callback); (*pdrv.get()).remove =3D Some(Self::remove_callback); (*pdrv.get()).driver.of_match_table =3D of_table; diff --git a/rust/kernel/usb.rs b/rust/kernel/usb.rs index c6ee98d12875..43259307986f 100644 --- a/rust/kernel/usb.rs +++ b/rust/kernel/usb.rs @@ -31,10 +31,10 @@ unsafe impl driver::RegistrationOps for Adapter { type RegType =3D bindings::usb_driver; =20 - unsafe fn register(udrv: &Opaque, name: = &'static CStr) -> Result { + unsafe fn register(udrv: &Opaque) -> Res= ult { // SAFETY: It's safe to set the fields of `struct usb_driver` on i= nitialization. unsafe { - (*udrv.get()).name =3D name.as_char_ptr(); + (*udrv.get()).name =3D M::NAME.as_char_ptr(); (*udrv.get()).probe =3D Some(Self::probe_callback); (*udrv.get()).disconnect =3D Some(Self::disconnect_callback); (*udrv.get()).id_table =3D T::ID_TABLE.as_ptr(); @@ -42,7 +42,7 @@ unsafe fn register(udrv: &Opaque, name: &'static C =20 // SAFETY: `udrv` is guaranteed to be a valid `RegType`. to_result(unsafe { - bindings::usb_register_driver(udrv.get(), M::OWNER.as_ptr(), n= ame.as_char_ptr()) + bindings::usb_register_driver(udrv.get(), M::OWNER.as_ptr(), M= ::NAME.as_char_ptr()) }) } =20 diff --git a/rust/macros/module.rs b/rust/macros/module.rs index 6b8753d122cc..6a1ce6435e8f 100644 --- a/rust/macros/module.rs +++ b/rust/macros/module.rs @@ -375,6 +375,13 @@ pub(crate) fn module(ts: TokenStream) -> TokenStream { #[allow(non_camel_case_types)] pub struct THIS_MODULE; =20 + impl THIS_MODULE {{ + /// Returns the name of this module. + pub const fn name() -> &'static ::kernel::str::CStr {{ + c\"{name}\" + }} + }} + impl ::kernel::prelude::ThisModule for THIS_MODULE {{ #[cfg(not(MODULE))]=20 const OWNER: ::kernel::this_module::ModuleWrapper =3D unsa= fe {{ @@ -392,13 +399,7 @@ impl ::kernel::prelude::ThisModule for THIS_MODULE {{ =20 ::kernel::this_module::ModuleWrapper::from_ptr(__this_= module.get()) }}; - }} - - /// The `LocalModule` type is the type of the module created b= y `module!`, - /// `module_pci_driver!`, `module_platform_driver!`, etc. - type LocalModule =3D {type_}; =20 - impl ::kernel::ModuleMetadata for {type_} {{ const NAME: &'static ::kernel::str::CStr =3D c\"{name}\"; }} =20 diff --git a/samples/rust/rust_driver_auxiliary.rs b/samples/rust/rust_driv= er_auxiliary.rs index e996dca19454..2f77b0873e81 100644 --- a/samples/rust/rust_driver_auxiliary.rs +++ b/samples/rust/rust_driver_auxiliary.rs @@ -18,7 +18,7 @@ use core::any::TypeId; use pin_init::PinInit; =20 -const MODULE_NAME: &CStr =3D ::NAME; +const MODULE_NAME: &CStr =3D THIS_MODULE::name(); const AUXILIARY_NAME: &CStr =3D c_str!("auxiliary"); =20 struct AuxiliaryDriver; @@ -113,8 +113,8 @@ struct SampleModule { impl InPlaceModule for SampleModule { fn init() -> impl PinInit { try_pin_init!(Self { - _pci_driver <- driver::Registration::new::(MODULE_NAME), - _aux_driver <- driver::Registration::new::(MODULE_NAME), + _pci_driver <- driver::Registration::new::(), + _aux_driver <- driver::Registration::new::(), }) } } --=20 2.43.0