From nobody Mon Feb 9 08:56:13 2026 Received: from mail-lf1-f51.google.com (mail-lf1-f51.google.com [209.85.167.51]) (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 5C42F34845F for ; Sat, 10 Jan 2026 15:09:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768057785; cv=none; b=jCRx9FvUNGnd2H51T7POwZBAcb6BiDbLhLb/T38Ck0zuV9d2oywBdHtmpWo+cqlT9BW7YNCgTB/5nn9Wm9B087PW4+5zPR75VHlMCfNczYd65qyDcvqqGhBWwaLJGDuuSh2Msh/reNgJ3931Z3vByxcpF6EQMI1gd0IgqVfucGQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768057785; c=relaxed/simple; bh=vEu6o7mqu+RFkiHGwwnRAU9DOgppBhVS6nTew5ATpME=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=a8LUpyZMlGJE6yF7QTSh2pVSRDazRO+RxuqbCERYSPDzQhHQ9w44hwjBkz2czaIHBLaf1+cRYHiCxiUkNqYudWTRCjgqxuPl4q6dnnVRLOy1MltPE1cv3LNREiMpl27PG6Y1RIyfIdDWc2Ctsvh/PZJCabfBpYUbQ/oPnZH2dl4= 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=cz3r1Urq; arc=none smtp.client-ip=209.85.167.51 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="cz3r1Urq" Received: by mail-lf1-f51.google.com with SMTP id 2adb3069b0e04-59b76c092acso2538261e87.2 for ; Sat, 10 Jan 2026 07:09:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1768057778; x=1768662578; 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=DzuWLdvnTvIXevxxHHGLaFpbvsHbVmOruxmKPq87W9o=; b=cz3r1UrqUJIOHGLYHbp1ATioMrsLVFjx6TPwHdxvlYpsDgbeLdNFdQhPhwzHwVFfKP Dimm9aQLhl2ECI+F5QvqhwlQt9vjkvDNXDWUTgDGlYmh2mUcjQ+aq37RoLY7nf87ry1K +j8fj04U7ee5DWbF8awr6BdvEgdmbqstUM/UQnvZdJJvW3p+KJwEaEEYzW6luax7INJG C1ovv0Gbse6bv8BYyYdCsERsNq5voVnElF6M0MQVrqmAyEDpyANwhIqeEiuNyzS/iorY F1R8TRBRktMeGbtjtTqcU05qt+WyXyxjaY3UWNMIqrXz6G/L/uG8xbMQlI7SEvkV1wbN ocFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1768057778; x=1768662578; 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=DzuWLdvnTvIXevxxHHGLaFpbvsHbVmOruxmKPq87W9o=; b=aAmKP/7EO0g1fZ3SW2LvsukWI5RzgHsNHtmUl2EqRbptQ95aBEeLLOI9qmFt3sprRQ fuoP6dBcxYvEReJH5+nxjngOTjJjREN1dKf3teVIOZL+zXyIzYBCgwLmroKHsojrgpmP a5Pz7DAC7wMkDVGXBRKiVOIH4LlgxjXhJEABHFECKv4GWScUMcLaHHmjQrb26ENJRt3o 6VKXLxkQHJpffT+xQQCW+1LAn0Yu+NQBffsG87rAdGEVNi6Zxuwqr/FvnOmmVlMg84RB hWXWiwR2ryy/xnoKpvN0nhW4BqI/vluvfz0zjAj6pAO7/Byqrh4+KmNzIm3SRAK6JhX9 sbog== X-Forwarded-Encrypted: i=1; AJvYcCVGJKmQhpZfHJMTfidEns1hLn//G1o9W4kv/t5x48cxkCs7QZAuhfEqaqKFDqcpPDlv53ePJFOACepCSSo=@vger.kernel.org X-Gm-Message-State: AOJu0Yx16tZds1rRuqEW3VTCRVbAsifHftxFjR3QwvsGuxcEpJ7w4gs2 BSv0D5WQB+lG/3uu/5zE8POG/FBNoB4HvJzDDUoSIbrE6y/AxMNWlEIk X-Gm-Gg: AY/fxX7KmPGjE2IHg5pUe2ELR8NC5rTlljqtklL0wnOVGZiXWJrOVjhgjsTytr10bhM AcfXMWx8w194sBvfFIbdg9urfOBZc6unP0O+xyo1L8A412tSMHKiEcciSedTAWnXBtCCp5Zl0h4 YnczcoaEsOQGpuX+T97KNRbVLlgn4dLA6Y3AAr+DdPPVgiI3iUadONcgRHbvLnG4wSwXi0cpwIQ XqIK9N6KeRAlt9VVnSQ1P/Qld84KWsOq8FQfHPgyQ+t+tJuwdBsbKm7Fg+tfK2YOHTK7TEWAuQg 5rzolozJjAccowJ0OXq3ZDsFu22TLoeSU6iv3wzXMYl8IodDzRtguVoYrFkcICP4b1QCuWRjZ2G fzkothYjKzc5BlHslbWclxnqT8JaHMTrR8UvI/iP9mMw+3HbpcgYsRNYcsSSGks9tm07lkhVzaO 4t2QXDBDP27EK/g93/VcRVCinhbIvK0SfvFGGrIv5+MuiL1YMFZnZCGzxJxjWUEzdEpuYmjBzR X-Google-Smtp-Source: AGHT+IFLDMt7DbdqdOgRShF10afiSlkPty68R8xdwB3Kov08d6DRT+5yzAdy80yfbTltM5orzzqaYg== X-Received: by 2002:ac2:43c6:0:b0:59b:717b:c152 with SMTP id 2adb3069b0e04-59b717bc2dcmr2791726e87.45.1768057777417; Sat, 10 Jan 2026 07:09:37 -0800 (PST) Received: from LT-5CG5341NQ4.nordic.imtech.com (37-33-148-7.bb.dnainternet.fi. [37.33.148.7]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-59b75543a64sm2137059e87.49.2026.01.10.07.09.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 10 Jan 2026 07:09:35 -0800 (PST) From: Kari Argillander Date: Sat, 10 Jan 2026 17:08:09 +0200 Subject: [PATCH RFC v3 11/15] 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: <20260110-this_module_fix-v3-11-97a3d9c14e8b@gmail.com> References: <20260110-this_module_fix-v3-0-97a3d9c14e8b@gmail.com> In-Reply-To: <20260110-this_module_fix-v3-0-97a3d9c14e8b@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=1768057742; l=12781; i=kari.argillander@gmail.com; s=20251219; h=from:subject:message-id; bh=vEu6o7mqu+RFkiHGwwnRAU9DOgppBhVS6nTew5ATpME=; b=NnABEyE/Pk4bWy5hCOXEnQHtaEsQAntdgS2iZw1heZr/zKZ6hQcUo0u71m4Mp+yEw2OywjHwp CaCAIC96IlRCBULnLQIFLppfR103aY/W+5Qeek2yDE7NO8zrxDif7Pb 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 84d67c5c87c8..8536a8eba45d 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