From nobody Mon Feb 9 08:29:02 2026 Received: from mail-lf1-f52.google.com (mail-lf1-f52.google.com [209.85.167.52]) (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 ADB21248F47 for ; Tue, 6 Jan 2026 16:13:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767716005; cv=none; b=FX2RTFtNqfIgymRCzOwegI5zc8ZcLCot8iYMjlzafp4DYV0HSPKwAU82HbNqMrDaoR0XnQpKCOpo+mOULr+jVwAXjVjB041wSaz++GLTWI3r7quovKGDJQtrMTSTVYUggfDrvDqh2u5Nt1iQiVnKU1WTPPCfuFkDMZsLWviRoPo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767716005; c=relaxed/simple; bh=UTNOeFwTGihFmlxHJgeXPwIlyRNHZuCVFbumdp1zOoM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Q+nqd0qAlR6r9tXrzJw5oo3n2QfiEUnD2mBlDON36Ak8yvULFC+YtylQpyTQfUR3WY++39hQ83H+HOkwgvsmcBgHkENBA6jBve+7i/rNVExV9ParnJJUHSzBoO6Rd0K451lvf7wkA8YAz2OaMampGfhexHVC7OasVHWKsigLBl4= 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=Sps4K1JO; arc=none smtp.client-ip=209.85.167.52 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="Sps4K1JO" Received: by mail-lf1-f52.google.com with SMTP id 2adb3069b0e04-59b6d5bd575so94135e87.1 for ; Tue, 06 Jan 2026 08:13:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1767715999; x=1768320799; 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=cO44XyCgtGl8WrKQeDHWNuLpTRXz0AQwF9LfwT0N9ro=; b=Sps4K1JOXzurYrdGsz9xKP7qdhBTfLSFRUQfmBKgdAg/LV+IWHa34XRXKLKZaGAJWL BM6DDhAgOkwLiLV2yx90OFTeV/p4vHfITfwecDySaBT/m+e1TxlKrqTTJqSweR0tSu8/ vrmwh22/PvdyaHN9wwR/LKNID4CZpvrVT/t7eJ6sea9Y+wgYU2bJBTYQs7g5nbkPcNeR Cpf+ziz+t1r59wbYLpnqDO62hyqWhkqgFdE41yDiAOozzVUGT8GCvbgLltAZ7okyN81A ILdUofKKVgTGA2q5iMmXgVVJmxKts9SNEPEDkg4d7t7/ZuDdoCS7HgCsQaIsMbIu04Dg XKkA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767715999; x=1768320799; 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=cO44XyCgtGl8WrKQeDHWNuLpTRXz0AQwF9LfwT0N9ro=; b=W+JqEQHo5AjWCrQwS8nEy0pyl8ZdnDabEGgfYrtXz9QB8kHF1bXgV8Hn1Alj5yKJ/U MfPdFHWjfhvaK1eN56jzKZBpFoeqM4aWH709KOxJNGoin7+yR2WJOOF6TkOhpF7dRiD+ fmgTHrKBpQUKm6FFXj9qjTIS0QdD0bu3WWxrLzt8PRVMFKVzzVJ/KJ0kw6hrZJJY7PLb 322e0OEPDtHjIzpcA8dLuiyQhRygp877YO4QNEYcAQTi3VpiNU7lUfGmdVJesHhgXP6N +WFmWfWit7J6+N2R+ygHVQeANuCRbOZiEPyYzKfP+YNJ0N82pl0z9dzFBmPbkYY2ica3 5+Xw== X-Forwarded-Encrypted: i=1; AJvYcCXR3OQiVZ73J1sey5t6a1w8srDDe9CUoO4TQL+TVohcR5uxvMh/hISzxC4YAS4zSCHGSoaKckSuXLQ10W8=@vger.kernel.org X-Gm-Message-State: AOJu0YyUvKmP5OxdkG+eVsUU+zyABCNVNldkP/N35Vv2K+P2ukYCVS1r zlcEpPFEgYtJMzwoJI1f15npjllMLi5es36O1d3/v82FA4Eyyutdgfo9 X-Gm-Gg: AY/fxX7gP8ZTsfBwRvJKemcJQ5ibJom+FUKl9cyZyL7lXIWdr9OBRvb0KLAMw2QhXaM 1f8gRGKNTuz1iDs2SODSihnPOKMCnUUK6/p9iVBDKA0jxbCcv6Ls1/Yyjs6qHnQ1oWfL9mI8+ec TJJzFemPFZdyJuWwhjGJNEoZBqowMgh2JT+4c/gxs/YwX4rcco50aHNLnO3WluEisF2Soxg0j/K eC21HCwHcofLM9uWelHRQvS9siAox02IjPpPhLGSCPXISwc1B6wIZL068hGtN2ohTqovnWSizsY DwYLY+Zcuf0hu2TYMT0cIz7+TADLnB7EFQxzNQrPlVqMMTleJ3wtLV4zQjGX1V3h7ome8XuvxEL 60dJozSOvzyQu+SxWZhS+IaUOaVo1HM1Ju7DwDUbdftBBQR+HieXWnYuH0FplB9iKJsdwhIke6b Kgmp/nyfzTPDbwZv03R3J5KbNjxVYvyWcI5Dzj+zuD6HHFnQZQp51OgeG8mdCrUIIaMaGvlyaMT pVOpuxAAJhFujw5 X-Google-Smtp-Source: AGHT+IHZLlib1FdNp6Mz3hTD00GnfYsdeklIwQwb155sldQfNtXmxDGwSdPNh/AFDq9/FqP+wutAPw== X-Received: by 2002:a05:6512:4016:b0:59a:108a:3215 with SMTP id 2adb3069b0e04-59b65292ccdmr1193890e87.23.1767715998955; Tue, 06 Jan 2026 08:13:18 -0800 (PST) Received: from LT-5CG5341NQ4.nordic.imtech.com (37-33-180-149.bb.dnainternet.fi. [37.33.180.149]) by smtp.gmail.com with ESMTPSA id 38308e7fff4ca-382eb91dfbdsm5256091fa.44.2026.01.06.08.13.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 06 Jan 2026 08:13:18 -0800 (PST) From: Kari Argillander Date: Tue, 06 Jan 2026 18:11:44 +0200 Subject: [PATCH RFC v2 06/11] rust: driver: make RegistrationOps::register() to use new ThisModule 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: <20260106-this_module_fix-v2-6-842ac026f00b@gmail.com> References: <20260106-this_module_fix-v2-0-842ac026f00b@gmail.com> In-Reply-To: <20260106-this_module_fix-v2-0-842ac026f00b@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 , Kari Argillander X-Mailer: b4 0.14.3 X-Developer-Signature: v=1; a=ed25519-sha256; t=1767715983; l=12781; i=kari.argillander@gmail.com; s=20251219; h=from:subject:message-id; bh=UTNOeFwTGihFmlxHJgeXPwIlyRNHZuCVFbumdp1zOoM=; b=DGUQmoqLCaQuejFYSYafK1smRUP3ShGq814VX89TAFuGO/2cknLNDFFelQnPhYq88scSSs2rx oNXoB+ngwz9Cdpu5utUuDtc8cd23TTWpFyJxHKbLJA/LfIe4C221/rk X-Developer-Key: i=kari.argillander@gmail.com; a=ed25519; pk=RwSxyhTpE3z4sywdDbIkC3q33ZQLNyhYWxT44iTY6r4= New version of ThisModule is trait which can be passed in const context. To have unified way to pass THIS_MODULE to abstactions have const parameter which can be used to get owner and name. Signed-off-by: Kari Argillander --- rust/kernel/auxiliary.rs | 16 ++++++++-------- rust/kernel/driver.rs | 29 +++++++++++++---------------- rust/kernel/i2c.rs | 11 ++++------- rust/kernel/pci.rs | 15 +++++---------- rust/kernel/platform.rs | 12 ++++-------- rust/kernel/usb.rs | 13 ++++--------- samples/rust/rust_driver_auxiliary.rs | 6 +++--- 7 files changed, 41 insertions(+), 61 deletions(-) diff --git a/rust/kernel/auxiliary.rs b/rust/kernel/auxiliary.rs index 56f3c180e8f6..102b0349af16 100644 --- a/rust/kernel/auxiliary.rs +++ b/rust/kernel/auxiliary.rs @@ -11,8 +11,8 @@ driver, error::{from_result, to_result, Result}, prelude::*, + this_module::ThisModule, types::Opaque, - ThisModule, }; use core::{ marker::PhantomData, @@ -28,14 +28,10 @@ unsafe impl driver::RegistrationOps for Adapter { type RegType =3D bindings::auxiliary_driver; =20 - unsafe fn register( - adrv: &Opaque, - name: &'static CStr, - module: &'static ThisModule, - ) -> Result { + unsafe fn register(adrv: &Opaque) -> Re= sult { // 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 TM::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(); @@ -43,7 +39,11 @@ unsafe fn register( =20 // SAFETY: `adrv` is guaranteed to be a valid `RegType`. to_result(unsafe { - bindings::__auxiliary_driver_register(adrv.get(), module.0, na= me.as_char_ptr()) + bindings::__auxiliary_driver_register( + adrv.get(), + TM::OWNER.as_ptr(), + TM::NAME.as_char_ptr(), + ) }) } =20 diff --git a/rust/kernel/driver.rs b/rust/kernel/driver.rs index 649d06468f41..dc7522c4ebda 100644 --- a/rust/kernel/driver.rs +++ b/rust/kernel/driver.rs @@ -94,10 +94,14 @@ //! [`device_id`]: kernel::device_id //! [`module_driver`]: kernel::module_driver =20 -use crate::error::{Error, Result}; -use crate::{acpi, device, of, str::CStr, try_pin_init, types::Opaque, This= Module}; -use core::pin::Pin; -use pin_init::{pin_data, pinned_drop, PinInit}; +use crate::{ + acpi, + device, + of, + prelude::*, + this_module::ThisModule, + types::Opaque, // +}; =20 /// The [`RegistrationOps`] trait serves as generic interface for subsyste= ms (e.g., PCI, Platform, /// Amba, etc.) to provide the corresponding subsystem specific implementa= tion to register / @@ -122,11 +126,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, - module: &'static ThisModule, - ) -> Result; + unsafe fn register(reg: &Opaque) -> Res= ult; =20 /// Unregisters a driver previously registered with [`RegistrationOps:= :register`]. /// @@ -159,7 +159,7 @@ unsafe impl Send for Registration {} =20 impl Registration { /// Creates a new instance of the registration object. - pub fn new(name: &'static CStr, module: &'static ThisModule) -> impl P= inInit { + 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. @@ -170,7 +170,7 @@ pub fn new(name: &'static CStr, module: &'static ThisMo= dule) -> impl PinInit) = }; =20 // SAFETY: `drv` is guaranteed to be pinned until `T::unre= gister`. - unsafe { T::register(drv, name, module) } + unsafe { T::register::(drv) } }), }) } @@ -202,13 +202,10 @@ struct DriverModule { =20 impl $crate::InPlaceModule for DriverModule { fn init( - module: &'static $crate::ThisModule + _module: &'static $crate::ThisModule ) -> impl ::pin_init::PinInit { $crate::try_pin_init!(Self { - _driver <- $crate::driver::Registration::new( - ::NAME, - module, - ), + _driver <- $crate::driver::Registration::new::(), }) } } diff --git a/rust/kernel/i2c.rs b/rust/kernel/i2c.rs index 491e6cc25cf4..b23a26a445cd 100644 --- a/rust/kernel/i2c.rs +++ b/rust/kernel/i2c.rs @@ -16,6 +16,7 @@ error::*, of, prelude::*, + this_module::ThisModule, types::{ AlwaysRefCounted, Opaque, // @@ -97,11 +98,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, - module: &'static ThisModule, - ) -> Result { + unsafe fn register(idrv: &Opaque) -> Re= sult { 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" @@ -124,7 +121,7 @@ unsafe fn register( =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 TM::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); @@ -134,7 +131,7 @@ unsafe fn register( } =20 // SAFETY: `idrv` is guaranteed to be a valid `RegType`. - to_result(unsafe { bindings::i2c_register_driver(module.0, idrv.ge= t()) }) + to_result(unsafe { bindings::i2c_register_driver(TM::OWNER.as_ptr(= ), idrv.get()) }) } =20 unsafe fn unregister(idrv: &Opaque) { diff --git a/rust/kernel/pci.rs b/rust/kernel/pci.rs index 82e128431f08..88a5416fb44b 100644 --- a/rust/kernel/pci.rs +++ b/rust/kernel/pci.rs @@ -18,9 +18,8 @@ to_result, // }, prelude::*, - str::CStr, - types::Opaque, - ThisModule, // + this_module::ThisModule, + types::Opaque, // }; use core::{ marker::PhantomData, @@ -55,14 +54,10 @@ unsafe impl driver::RegistrationOps for Adapter { type RegType =3D bindings::pci_driver; =20 - unsafe fn register( - pdrv: &Opaque, - name: &'static CStr, - module: &'static ThisModule, - ) -> Result { + unsafe fn register(pdrv: &Opaque) -> Re= sult { // 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 TM::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(); @@ -70,7 +65,7 @@ unsafe fn register( =20 // SAFETY: `pdrv` is guaranteed to be a valid `RegType`. to_result(unsafe { - bindings::__pci_register_driver(pdrv.get(), module.0, name.as_= char_ptr()) + bindings::__pci_register_driver(pdrv.get(), TM::OWNER.as_ptr()= , TM::NAME.as_char_ptr()) }) } =20 diff --git a/rust/kernel/platform.rs b/rust/kernel/platform.rs index bddb593cee7b..a4678af3b891 100644 --- a/rust/kernel/platform.rs +++ b/rust/kernel/platform.rs @@ -13,8 +13,8 @@ irq::{self, IrqRequest}, of, prelude::*, + this_module::ThisModule, types::Opaque, - ThisModule, }; =20 use core::{ @@ -31,11 +31,7 @@ unsafe impl driver::RegistrationOps for Adapter { type RegType =3D bindings::platform_driver; =20 - unsafe fn register( - pdrv: &Opaque, - name: &'static CStr, - module: &'static ThisModule, - ) -> Result { + unsafe fn register(pdrv: &Opaque) -> Re= sult { let of_table =3D match T::OF_ID_TABLE { Some(table) =3D> table.as_ptr(), None =3D> core::ptr::null(), @@ -48,7 +44,7 @@ unsafe fn register( =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 TM::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; @@ -56,7 +52,7 @@ unsafe fn register( } =20 // SAFETY: `pdrv` is guaranteed to be a valid `RegType`. - to_result(unsafe { bindings::__platform_driver_register(pdrv.get()= , module.0) }) + to_result(unsafe { bindings::__platform_driver_register(pdrv.get()= , TM::OWNER.as_ptr()) }) } =20 unsafe fn unregister(pdrv: &Opaque) { diff --git a/rust/kernel/usb.rs b/rust/kernel/usb.rs index d10b65e9fb6a..e7e07360f953 100644 --- a/rust/kernel/usb.rs +++ b/rust/kernel/usb.rs @@ -11,9 +11,8 @@ driver, error::{from_result, to_result, Result}, prelude::*, - str::CStr, + this_module::ThisModule, types::{AlwaysRefCounted, Opaque}, - ThisModule, }; use core::{ marker::PhantomData, @@ -32,14 +31,10 @@ unsafe impl driver::RegistrationOps for Adapter { type RegType =3D bindings::usb_driver; =20 - unsafe fn register( - udrv: &Opaque, - name: &'static CStr, - module: &'static ThisModule, - ) -> Result { + unsafe fn register(udrv: &Opaque) -> Re= sult { // 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 TM::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(); @@ -47,7 +42,7 @@ unsafe fn register( =20 // SAFETY: `udrv` is guaranteed to be a valid `RegType`. to_result(unsafe { - bindings::usb_register_driver(udrv.get(), module.0, name.as_ch= ar_ptr()) + bindings::usb_register_driver(udrv.get(), TM::OWNER.as_ptr(), = TM::NAME.as_char_ptr()) }) } =20 diff --git a/samples/rust/rust_driver_auxiliary.rs b/samples/rust/rust_driv= er_auxiliary.rs index 1e4fb23cfcb0..28a25e540298 100644 --- a/samples/rust/rust_driver_auxiliary.rs +++ b/samples/rust/rust_driver_auxiliary.rs @@ -111,10 +111,10 @@ struct SampleModule { } =20 impl InPlaceModule for SampleModule { - fn init(module: &'static kernel::ThisModule) -> impl PinInit { + fn init(_module: &'static kernel::ThisModule) -> impl PinInit { try_pin_init!(Self { - _pci_driver <- driver::Registration::new(MODULE_NAME, module), - _aux_driver <- driver::Registration::new(MODULE_NAME, module), + _pci_driver <- driver::Registration::new::(), + _aux_driver <- driver::Registration::new::(), }) } } --=20 2.43.0