From nobody Mon Feb 9 10:25:52 2026 Received: from mail-lj1-f180.google.com (mail-lj1-f180.google.com [209.85.208.180]) (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 CDFC12472A2 for ; Thu, 1 Jan 2026 05:21:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767244899; cv=none; b=NFPtJAOvz/g3RO/aSSpZ1ScbYDGlZvZRz77N9GYbGNg3gJtk5QwEXV4qDW5WQDO3svTYpP8k3LJTXN7aTWfrEbubqYoqtCKryr/Lwii+po6lV7bAwPuvtv/X+BjKHbgTsha5KLv+b0P4HEShj8BtxnCLLXF+ofpo6J/L8SIhHps= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767244899; c=relaxed/simple; bh=mU7s+7tWle8pm/zSL/diWG1twIvZ0xjTqsG/iAaLFVs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Pa2oGqOEI2EdNcXZfpBQb2c6ftr1I9ICPXr+vf5KtZBoFTjczMsJvmrChnXD2FbG9JzZCsJ3jTlg9/dRr9bMXFJ43e8DXQj9ZCc+FRPZABh4rVBuSZQuzUF4TtNVuzZyIbmkpaCgOb2NuSua3tvMCvHSQizP8EY8ebLaHB7vplo= 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=EhsAcM2J; arc=none smtp.client-ip=209.85.208.180 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="EhsAcM2J" Received: by mail-lj1-f180.google.com with SMTP id 38308e7fff4ca-37d96f97206so84676111fa.3 for ; Wed, 31 Dec 2025 21:21:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1767244896; x=1767849696; 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=Rd8KgyV6F2j/qbBvIqB4YfMbMB7FNH9gnCb0sBOPwfY=; b=EhsAcM2JNjP8uGkuj4KLoD3okLmvDAhpRQfXYb6JxePqzeivU3TSoycT5XPqG8HYwL a4KBjXCBeZEz3DgRcrI61R2tN9I/op4oFd3pVkKdYOOP99ibeXEUMOISHFOupLfttrhx eH/qPGrI0u2a1oUYeUON1+FPFTWiZ3TVspFDY2GnM636HSnIJ8Dqjx8ael7+7xb3tk18 uJMpwJ48Gv0B5qH8mI8BNYbwk2jv56n+MPqPXbJQsFDryQuKC8KT/0HGeRCZB/kIueeb IVLnzaLpfnV6D9Maq/5ZbbExZPhHO0PLhmGQ7HTaskketkp54in57NNy4EEyMEAk5tSU MY7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767244896; x=1767849696; 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=Rd8KgyV6F2j/qbBvIqB4YfMbMB7FNH9gnCb0sBOPwfY=; b=Uupfp6e/x9gYGn+3eEmiAusOQgQkmUJ31CUVXji2kjS1b4PvK1u1Hj63OI6XaA+ZFO jS3/PoU6mgNzXzPlG2FSNlCTBQWkAJc80zFYooI43QESI3Mt1Gc9pY6N0FsM1gRz4mC4 xjjrtGqvGjkXSwi91vC7uMRGXGvvawmhYkN7NZIg0e/yHk/MzkgnAMNEZvXZTqmYudbw YDx5yjYxrA2D7aT6NSfGowqvmpnVpZekqJF2q+ncSoLxEAO0Lf4ajeqTVc4Y6BvVuw45 zF23UYJjTyxC6W1hDf+2vfK48ZAU8z8udVntEvnsK1KvFzSMYOey7Haa9QytNUPGsJsz q/hQ== X-Forwarded-Encrypted: i=1; AJvYcCU3E+QXRX8sGvB6pn69OYKerxhYyMOpA1Y7YO0jjkbWh5VXUII5jhgDReRJI5Nb90FraebO1SF25TINCo0=@vger.kernel.org X-Gm-Message-State: AOJu0Yy1hhrK/9pbi/HO+88lmXMN8uHAIlvowmlaxbBVCH/G935g/wq4 qB5qJJfjco7k1SVfmN1RNTrKaoCqTWjNL618VvHfDozi1vn52hbml9Yk X-Gm-Gg: AY/fxX49gu62mf51wWR91NUtt9/YjjYBnuwX5KU9nHwWif4Kh+RmAN8A75qURoGu0Za lPzF2pdFL5RB6uDThv4TR0Z837DhQM5OW3jmL958Es8e73/4nXXCzHBkFjXGFv4vt0S8VM75j/o xDxdel7/gr9dJIvKxwD3hiMqHp85PCqXAoDWXr3KxpdSGMu0hhXQYf5wqMK1BjrajB6/SdBo6af hQR4OL6wXIlQo4jxjOkgkaF08VmeCuX2UwoOejK59KBFtv/kn/Yn92axNQ2nUV3v5LILR6rAZrN arKf2HlFLQvOkA2ZnGuXTzvXyIl3PvYpMiQU+d/OaAhc4w4CFmlO9JGdI+WZRte0uzJeY3VcF9p jrvL+bmPzvyxdnDCKfcHdd6q5QFH8Br0fPxFSEtys6YyzvpgzApm09HoxR5DIStcpQbre2azuBV 8x0qvmzWMGbd05km0J10kkIwnltUZVNjwO/ko6DVWuwGCSB0LoohuSfMGyTQxsW0gKWLHV0WLEP 5dSSRr/rofQEEYf X-Google-Smtp-Source: AGHT+IGRQFvH4f88ZR5TKWqHF2jFP4khZugE+rhqFElCpV/e1k3ApZo6w/n7a0Bu3kCAQWxd13ewgg== X-Received: by 2002:a05:651c:30ca:b0:382:60a5:331e with SMTP id 38308e7fff4ca-38260a537b8mr69604671fa.28.1767244895673; Wed, 31 Dec 2025 21:21:35 -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.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 31 Dec 2025 21:21:33 -0800 (PST) From: Kari Argillander Date: Thu, 01 Jan 2026 07:20:46 +0200 Subject: [PATCH RFC 2/6] rust: WIP: Introduce ThisModule trait and THIS_MODULE impl 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-2-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=5717; i=kari.argillander@gmail.com; s=20251219; h=from:subject:message-id; bh=mU7s+7tWle8pm/zSL/diWG1twIvZ0xjTqsG/iAaLFVs=; b=/GQEca3eN2s3ciSbXCmGhgObb8BIPcjCfeRRMtC0Uh/y5Lr4prsvIJqfmeLcMLuXGTf8x3FF7 C3/y0olv51EDa8VyGRLe5r57ole2bM00+sMDk4fEy7Tk2SwHQg4FAbp X-Developer-Key: i=kari.argillander@gmail.com; a=ed25519; pk=RwSxyhTpE3z4sywdDbIkC3q33ZQLNyhYWxT44iTY6r4= --- rust/kernel/lib.rs | 61 +++++++++++++++++++++++++++++++++++------------= ---- rust/macros/module.rs | 36 ++++++++++++++++++------------ 2 files changed, 64 insertions(+), 33 deletions(-) diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs index 69a798fbb563..224410745734 100644 --- a/rust/kernel/lib.rs +++ b/rust/kernel/lib.rs @@ -205,31 +205,54 @@ pub trait ModuleMetadata { const NAME: &'static crate::str::CStr; } =20 -/// 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); +pub mod this_module { + //! TODO + //! + //! # For driver cretors + //! + //! For each module we define own custom THIS_MODULE in + //! [`macros::module::module`]. Mechanism is equivalent to `THIS_MODUL= E` in + //! the [C API](srctree/include/linux/init.h). + //! + //! TODO + //! + //! # For abstraction creators + //! + //! TODO =20 -// SAFETY: `THIS_MODULE` may be used from all threads within a module. -unsafe impl Sync for ThisModule {} + /// See [`this_module`] + pub trait ThisModule { + /// TODO Doc + const OWNER: ModuleWrapper; + } =20 -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) + /// See [`this_module`] + pub struct ModuleWrapper { + ptr: *mut bindings::module, } =20 - /// 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 + impl ModuleWrapper { + /// Get the raw pointer to the underlying `struct module`. + /// + /// TODO: Should be only available for kernel create. + pub const fn as_ptr(&self) -> *mut bindings::module { + self.ptr + } + + /// Only meant to use in [`macros::module::module`]. + /// + /// # Safety + /// + /// - Only modules are allowed to create non null `ModuleWrapper`s. + /// - The pointer must point to a valid `struct module` provided b= y the + /// kernel. + #[doc(hidden)] + pub const unsafe fn from_ptr(ptr: *mut bindings::module) -> Self { + ModuleWrapper { ptr } + } } } +pub use this_module::*; =20 #[cfg(not(testlib))] #[panic_handler] diff --git a/rust/macros/module.rs b/rust/macros/module.rs index 80cb9b16f5aa..6b8753d122cc 100644 --- a/rust/macros/module.rs +++ b/rust/macros/module.rs @@ -371,20 +371,28 @@ pub(crate) fn module(ts: TokenStream) -> TokenStream { /// Used by the printing macros, e.g. [`info!`]. const __LOG_PREFIX: &[u8] =3D b\"{name}\\0\"; =20 - // SAFETY: `__this_module` is constructed by the kernel at loa= d time and will not be - // freed until the module is unloaded. - #[cfg(MODULE)] - static THIS_MODULE: ::kernel::ThisModule =3D unsafe {{ - extern \"C\" {{ - static __this_module: ::kernel::types::Opaque<::kernel= ::bindings::module>; - }} + /// THIS_MODULE for \"{name}\". See more at [`kernel::this_mod= ule`]. + #[allow(non_camel_case_types)] + pub struct THIS_MODULE; + + impl ::kernel::prelude::ThisModule for THIS_MODULE {{ + #[cfg(not(MODULE))]=20 + const OWNER: ::kernel::this_module::ModuleWrapper =3D unsa= fe {{ + ::kernel::this_module::ModuleWrapper::from_ptr(::core:= :ptr::null_mut()) + }}; =20 - ::kernel::ThisModule::from_ptr(__this_module.get()) - }}; - #[cfg(not(MODULE))] - static THIS_MODULE: ::kernel::ThisModule =3D unsafe {{ - ::kernel::ThisModule::from_ptr(::core::ptr::null_mut()) - }}; + #[cfg(MODULE)] + // SAFETY: + // - `__this_module` is constructed by the kernel at modul= e load time. + // - We use check that we are module so we can create non-= null ModuleWrapper. + const OWNER: ::kernel::this_module::ModuleWrapper =3D unsa= fe {{ + extern \"C\" {{ + static __this_module: ::kernel::types::Opaque<::ke= rnel::bindings::module>; + }} + =20 + ::kernel::this_module::ModuleWrapper::from_ptr(__this_= module.get()) + }}; + }} =20 /// The `LocalModule` type is the type of the module created b= y `module!`, /// `module_pci_driver!`, `module_platform_driver!`, etc. @@ -502,7 +510,7 @@ mod __module_init {{ /// This function must only be called once. unsafe fn __init() -> ::kernel::ffi::c_int {{ let initer =3D - <{type_} as ::kernel::InPlaceModule>::init(&su= per::super::THIS_MODULE); + <{type_} as ::kernel::InPlaceModule>::init::(); // SAFETY: No data race, since `__MOD` can only be= accessed by this module // and there only `__init` and `__exit` access it.= These functions are only // called once and `__exit` cannot be called befor= e or during `__init`. --=20 2.43.0