Linux Modules
 help / color / mirror / Atom feed
* [PATCH 0/8] Fix missing fops.owner in Rust DRM/misc abstractions
@ 2026-05-19  6:26 Alvin Sun
  2026-05-19  6:26 ` [PATCH 1/8] rust: module: add `MODULE_PTR` const to `ModuleMetadata` trait Alvin Sun
                   ` (7 more replies)
  0 siblings, 8 replies; 12+ messages in thread
From: Alvin Sun @ 2026-05-19  6:26 UTC (permalink / raw)
  To: Miguel Ojeda, Boqun Feng, Gary Guo, Björn Roy Baron,
	Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross,
	Danilo Krummrich, Luis Chamberlain, Petr Pavlu, Daniel Gomez,
	Sami Tolvanen, Aaron Tomlin, Greg Kroah-Hartman,
	Rafael J. Wysocki, David Airlie, Simona Vetter, Daniel Almeida,
	Arnd Bergmann
  Cc: rust-for-linux, linux-kernel, linux-modules, driver-core,
	dri-devel, nova-gpu, Alvin Sun

During tyr debugfs development, a kernel NULL pointer dereference was
encountered after `rmmod tyr` while gnome-shell still held /dev/card1 open:

```
  [158827.868132] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
  [158827.868918] Mem abort info:
  [158827.869177]   ESR = 0x0000000086000004
  [158827.869519]   EC = 0x21: IABT (current EL), IL = 32 bits
  [158827.870000]   SET = 0, FnV = 0
  [158827.870281]   EA = 0, S1PTW = 0
  [158827.870571]   FSC = 0x04: level 0 translation fault
  [158827.871043] user pgtable: 4k pages, 48-bit VAs, pgdp=0000000108dec000
  [158827.871623] [0000000000000000] pgd=0000000000000000, p4d=0000000000000000
  [158827.872242] Internal error: Oops: 0000000086000004 [#1]  SMP
  [158827.872246] Modules linked in: tyr sunrpc snd_soc_simple_card rk805_pwrkey snd_soc_simple_card_utils rtw88_8822bu display_connector rtw88_usb rtw88_8822b snd_soc_rockchip_i2s_tdm snd_soc_hdmi_codec
  rtw88_core]
  [158827.872337] CPU: 4 UID: 1000 PID: 11276 Comm: gnome-s:disk$0 Tainted: G                 N  7.1.0-rc1+ #331 PREEMPT
  [158827.880534] Tainted: [N]=TEST
  [158827.880535] Hardware name: FriendlyElec NanoPi R6C/NanoPi R6C, BIOS v1.1 04/09/2025
  [158827.880538] pstate: 60400009 (nZCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
  [158827.880542] pc : 0x0
  [158827.880547] lr : _RNvNtCs257m05FHVbX_3tyr2vm8pt_unmap+0x8c/0x12c [tyr]
  [158827.880578] sp : ffff800083c236b0
  [158827.880579] x29: ffff800083c236d0 x28: ffff00013f8a0000 x27: 0000000000000000
  [158827.880585] x26: 000000000000007c x25: ffff000108e6ed80 x24: 0000000000401000
  [158827.880590] x23: 0000000000000000 x22: 0000000040000000 x21: 0000000000001000
  [158827.880595] x20: ffff00010f778138 x19: 0000000000400000 x18: 00000000ffffffff
  [158827.880600] x17: 000000040044ffff x16: 045000f2b5503510 x15: 0720072007200720
  [158827.880606] x14: 0720072007200720 x13: 0000000000401000 x12: 0000000000400000
  [158827.880611] x11: ffff800083c239d0 x10: ffff000141e4fd88 x9 : 0000000000000000
  [158827.880615] x8 : 0000000000000000 x7 : 0000000000000000 x6 : 0000000000400000
  [158827.880620] x5 : ffff00013f8a0000 x4 : 0000000000000000 x3 : 0000000000000001
  [158827.880625] x2 : 0000000000001000 x1 : 0000000000400000 x0 : ffff00010f778138
  [158827.880630] Call trace:
  [158827.880632]  0x0 (P)
  [158827.880635]  _RNvXs6_NtCs257m05FHVbX_3tyr2vmNtB5_9GpuVmDataNtNtNtCsgmSOfgXi5CZ_6kernel3drm5gpuvm11DriverGpuVm13sm_step_unmap+0x3c/0x120 [tyr]
  [158827.891166]  _RNvMs4_NtNtNtCsgmSOfgXi5CZ_6kernel3drm5gpuvm6sm_opsINtB7_5GpuVmNtNtCs257m05FHVbX_3tyr2vm9GpuVmDataE13sm_step_unmapB13_+0x18/0x34 [tyr]
  [158827.891187]  op_unmap_cb+0x78/0xb0
  [158827.891196]  __drm_gpuvm_sm_unmap+0x18c/0x1b4
  [158827.891204]  drm_gpuvm_sm_unmap+0x38/0x4c
  [158827.891209]  _RNvMs5_NtCs257m05FHVbX_3tyr2vmNtB5_2Vm7exec_op+0x1cc/0x254 [tyr]
  [158827.894085]  _RNvMs5_NtCs257m05FHVbX_3tyr2vmNtB5_2Vm11unmap_range+0x124/0x188 [tyr]
  [158827.894105]  _RINvNtCs5hGKnPbRUFW_4core3ptr13drop_in_placeNtNtCs257m05FHVbX_3tyr3gem8KernelBoEBK_+0x44/0xd8 [tyr]
  [158827.894125]  _RINvNtCs5hGKnPbRUFW_4core3ptr13drop_in_placeINtNtNtCsgmSOfgXi5CZ_6kernel5alloc4kvec3VecNtNtCs257m05FHVbX_3tyr2fw7SectionNtNtBL_9allocator7KmallocEEB1r_+0x3c/0x100 [tyr]
  [158827.894147]  _RINvNtCs5hGKnPbRUFW_4core3ptr13drop_in_placeINtNtNtCsgmSOfgXi5CZ_6kernel4sync3arc3ArcNtNtCs257m05FHVbX_3tyr2fw8FirmwareEEB1p_+0x94/0x190 [tyr]
  [158827.894167]  _RNvMs4_NtNtCsgmSOfgXi5CZ_6kernel3drm6deviceINtB5_6DeviceNtNtCs257m05FHVbX_3tyr6driver12TyrDrmDriverE7releaseBW_+0x30/0x98 [tyr]
  [158827.899550]  drm_dev_put.part.0+0x88/0xc0
  [158827.899557]  drm_minor_release+0x18/0x28
  [158827.899562]  drm_release+0x144/0x170
  [158827.899567]  __fput+0xe4/0x30c
  [158827.899573]  ____fput+0x14/0x20
  [158827.899579]  task_work_run+0x7c/0xe8
  [158827.899586]  do_exit+0x2a8/0xac4
  [158827.899590]  do_group_exit+0x34/0x90
  [158827.899594]  get_signal+0xaac/0xabc
  [158827.899599]  arch_do_signal_or_restart+0x90/0x3e8
  [158827.899606]  exit_to_user_mode_loop+0x140/0x1d0
  [158827.899613]  el0_svc+0x2f4/0x2f8
  [158827.899620]  el0t_64_sync_handler+0xa0/0xe4
  [158827.899627]  el0t_64_sync+0x198/0x19c
  [158827.899632] ---[ end trace 0000000000000000 ]---
```

The root cause: fops.owner was NULL in Rust DRM drivers, so the kernel never
blocked module unloading while file descriptors were open. This leads to
use-after-free when drm_release (or other fops) is called on freed module code. 

The series adds MODULE_PTR to ModuleMetadata, threads ThisModule through the
DRM Driver trait into create_fops(), and applies the same fix to miscdevice.

Signed-off-by: Alvin Sun <alvin.sun@linux.dev>
---
Alvin Sun (8):
      rust: module: add `MODULE_PTR` const to `ModuleMetadata` trait
      rust: driver: make `DriverModule` struct pub(crate) in `module_driver!`
      rust: drm: add `ThisModule` associated type to `Driver` trait
      gpu: nova: implement `ThisModule`
      gpu: tyr: implement `ThisModule`
      rust: drm: set fops.owner from driver module pointer
      rust: miscdevice: add `ThisModule` associated type to `MiscDevice` trait
      samples: rust: rust_misc_device: implement `ThisModule` for `RustMiscDevice`

 drivers/gpu/drm/nova/driver.rs   |  1 +
 drivers/gpu/drm/tyr/driver.rs    |  1 +
 rust/kernel/driver.rs            |  2 +-
 rust/kernel/drm/device.rs        |  3 ++-
 rust/kernel/drm/driver.rs        |  3 +++
 rust/kernel/drm/gem/mod.rs       |  4 ++--
 rust/kernel/lib.rs               |  3 +++
 rust/kernel/miscdevice.rs        |  5 +++++
 rust/macros/module.rs            | 14 ++++++++++++++
 samples/rust/rust_misc_device.rs |  1 +
 10 files changed, 33 insertions(+), 4 deletions(-)
---
base-commit: aa61612ab641d7d62b0b6889f2c7c9251489f6e3
change-id: 20260519-fix-fops-owner-e3a77bb27c6c
prerequisite-change-id: 20260519-miscdev-use-format-9ab7e83b1c11:v1
prerequisite-patch-id: 405b334ff0d48ad350014f05a2321bdbaa025400
prerequisite-patch-id: 604b631c81d5423f4ebb2e12ba2d22e9ce371bfc

Best regards,
-- 
Alvin Sun <alvin.sun@linux.dev>



^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 1/8] rust: module: add `MODULE_PTR` const to `ModuleMetadata` trait
  2026-05-19  6:26 [PATCH 0/8] Fix missing fops.owner in Rust DRM/misc abstractions Alvin Sun
@ 2026-05-19  6:26 ` Alvin Sun
  2026-05-19 11:57   ` Gary Guo
  2026-05-19  6:26 ` [PATCH 2/8] rust: driver: make `DriverModule` struct pub(crate) in `module_driver!` Alvin Sun
                   ` (6 subsequent siblings)
  7 siblings, 1 reply; 12+ messages in thread
From: Alvin Sun @ 2026-05-19  6:26 UTC (permalink / raw)
  To: Miguel Ojeda, Boqun Feng, Gary Guo, Björn Roy Baron,
	Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross,
	Danilo Krummrich, Luis Chamberlain, Petr Pavlu, Daniel Gomez,
	Sami Tolvanen, Aaron Tomlin, Greg Kroah-Hartman,
	Rafael J. Wysocki, David Airlie, Simona Vetter, Daniel Almeida,
	Arnd Bergmann
  Cc: rust-for-linux, linux-kernel, linux-modules, driver-core,
	dri-devel, nova-gpu, Alvin Sun

Add a `MODULE_PTR` const to the `ModuleMetadata` trait so that
modules can provide a constant pointer to their `struct module`
usable in const contexts such as static file_operations.

Signed-off-by: Alvin Sun <alvin.sun@linux.dev>
---
 rust/kernel/lib.rs    |  3 +++
 rust/macros/module.rs | 14 ++++++++++++++
 2 files changed, 17 insertions(+)

diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs
index b72b2fbe046d6..c7e809636e1a9 100644
--- a/rust/kernel/lib.rs
+++ b/rust/kernel/lib.rs
@@ -184,6 +184,9 @@ fn init(module: &'static ThisModule) -> impl pin_init::PinInit<Self, error::Erro
 pub trait ModuleMetadata {
     /// The name of the module as specified in the `module!` macro.
     const NAME: &'static crate::str::CStr;
+
+    /// The pointer to the kernel `struct module` for this module.
+    const MODULE_PTR: *mut bindings::module;
 }
 
 /// Equivalent to `THIS_MODULE` in the C API.
diff --git a/rust/macros/module.rs b/rust/macros/module.rs
index 06c18e2075083..7204fe604f24a 100644
--- a/rust/macros/module.rs
+++ b/rust/macros/module.rs
@@ -519,6 +519,20 @@ pub(crate) fn module(info: ModuleInfo) -> Result<TokenStream> {
 
         impl ::kernel::ModuleMetadata for #type_ {
             const NAME: &'static ::kernel::str::CStr = #name_cstr;
+
+            #[cfg(MODULE)]
+            const MODULE_PTR: *mut ::kernel::bindings::module = {
+                extern "C" {
+                    static __this_module: ::kernel::types::Opaque<::kernel::bindings::module>;
+                }
+
+                // SAFETY: `__this_module` is constructed by the kernel at load time
+                // and lives until the module is unloaded.
+                unsafe { __this_module.get() }
+            };
+
+            #[cfg(not(MODULE))]
+            const MODULE_PTR: *mut ::kernel::bindings::module = ::core::ptr::null_mut();
         }
 
         // Double nested modules, since then nobody can access the public items inside.

-- 
2.43.0



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 2/8] rust: driver: make `DriverModule` struct pub(crate) in `module_driver!`
  2026-05-19  6:26 [PATCH 0/8] Fix missing fops.owner in Rust DRM/misc abstractions Alvin Sun
  2026-05-19  6:26 ` [PATCH 1/8] rust: module: add `MODULE_PTR` const to `ModuleMetadata` trait Alvin Sun
@ 2026-05-19  6:26 ` Alvin Sun
  2026-05-19 11:53   ` Gary Guo
  2026-05-19  6:26 ` [PATCH 3/8] rust: drm: add `ThisModule` associated type to `Driver` trait Alvin Sun
                   ` (5 subsequent siblings)
  7 siblings, 1 reply; 12+ messages in thread
From: Alvin Sun @ 2026-05-19  6:26 UTC (permalink / raw)
  To: Miguel Ojeda, Boqun Feng, Gary Guo, Björn Roy Baron,
	Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross,
	Danilo Krummrich, Luis Chamberlain, Petr Pavlu, Daniel Gomez,
	Sami Tolvanen, Aaron Tomlin, Greg Kroah-Hartman,
	Rafael J. Wysocki, David Airlie, Simona Vetter, Daniel Almeida,
	Arnd Bergmann
  Cc: rust-for-linux, linux-kernel, linux-modules, driver-core,
	dri-devel, nova-gpu, Alvin Sun

Expose the generated `DriverModule` struct as `pub(crate)` so that
driver implementations can reference it via `super::DriverModule`
for the `ThisModule` associated type.

Signed-off-by: Alvin Sun <alvin.sun@linux.dev>
---
 rust/kernel/driver.rs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/rust/kernel/driver.rs b/rust/kernel/driver.rs
index 36de8098754d0..9c7c69c4d2af0 100644
--- a/rust/kernel/driver.rs
+++ b/rust/kernel/driver.rs
@@ -253,7 +253,7 @@ macro_rules! module_driver {
         type Ops<$gen_type> = $driver_ops;
 
         #[$crate::prelude::pin_data]
-        struct DriverModule {
+        pub(crate) struct DriverModule {
             #[pin]
             _driver: $crate::driver::Registration<Ops<$type>>,
         }

-- 
2.43.0



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 3/8] rust: drm: add `ThisModule` associated type to `Driver` trait
  2026-05-19  6:26 [PATCH 0/8] Fix missing fops.owner in Rust DRM/misc abstractions Alvin Sun
  2026-05-19  6:26 ` [PATCH 1/8] rust: module: add `MODULE_PTR` const to `ModuleMetadata` trait Alvin Sun
  2026-05-19  6:26 ` [PATCH 2/8] rust: driver: make `DriverModule` struct pub(crate) in `module_driver!` Alvin Sun
@ 2026-05-19  6:26 ` Alvin Sun
  2026-05-19 11:58   ` Gary Guo
  2026-05-19  6:26 ` [PATCH 4/8] gpu: nova: implement `ThisModule` Alvin Sun
                   ` (4 subsequent siblings)
  7 siblings, 1 reply; 12+ messages in thread
From: Alvin Sun @ 2026-05-19  6:26 UTC (permalink / raw)
  To: Miguel Ojeda, Boqun Feng, Gary Guo, Björn Roy Baron,
	Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross,
	Danilo Krummrich, Luis Chamberlain, Petr Pavlu, Daniel Gomez,
	Sami Tolvanen, Aaron Tomlin, Greg Kroah-Hartman,
	Rafael J. Wysocki, David Airlie, Simona Vetter, Daniel Almeida,
	Arnd Bergmann
  Cc: rust-for-linux, linux-kernel, linux-modules, driver-core,
	dri-devel, nova-gpu, Alvin Sun

Add a `ThisModule` associated type bound by `ModuleMetadata` to the
`drm::Driver` trait, allowing DRM drivers to expose their module
pointer for use in file operations.

Signed-off-by: Alvin Sun <alvin.sun@linux.dev>
---
 rust/kernel/drm/driver.rs | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/rust/kernel/drm/driver.rs b/rust/kernel/drm/driver.rs
index 5233bdebc9fcd..c798961650c1a 100644
--- a/rust/kernel/drm/driver.rs
+++ b/rust/kernel/drm/driver.rs
@@ -115,6 +115,9 @@ pub trait Driver {
 
     /// IOCTL list. See `kernel::drm::ioctl::declare_drm_ioctls!{}`.
     const IOCTLS: &'static [drm::ioctl::DrmIoctlDescriptor];
+
+    /// The module implementing this driver.
+    type ThisModule: crate::ModuleMetadata;
 }
 
 /// The registration type of a `drm::Device`.

-- 
2.43.0



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 4/8] gpu: nova: implement `ThisModule`
  2026-05-19  6:26 [PATCH 0/8] Fix missing fops.owner in Rust DRM/misc abstractions Alvin Sun
                   ` (2 preceding siblings ...)
  2026-05-19  6:26 ` [PATCH 3/8] rust: drm: add `ThisModule` associated type to `Driver` trait Alvin Sun
@ 2026-05-19  6:26 ` Alvin Sun
  2026-05-19  6:26 ` [PATCH 5/8] gpu: tyr: " Alvin Sun
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Alvin Sun @ 2026-05-19  6:26 UTC (permalink / raw)
  To: Miguel Ojeda, Boqun Feng, Gary Guo, Björn Roy Baron,
	Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross,
	Danilo Krummrich, Luis Chamberlain, Petr Pavlu, Daniel Gomez,
	Sami Tolvanen, Aaron Tomlin, Greg Kroah-Hartman,
	Rafael J. Wysocki, David Airlie, Simona Vetter, Daniel Almeida,
	Arnd Bergmann
  Cc: rust-for-linux, linux-kernel, linux-modules, driver-core,
	dri-devel, nova-gpu, Alvin Sun

Set `ThisModule = super::DriverModule` to provide the correct module
pointer for file operations ownership.

Signed-off-by: Alvin Sun <alvin.sun@linux.dev>
---
 drivers/gpu/drm/nova/driver.rs | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/nova/driver.rs b/drivers/gpu/drm/nova/driver.rs
index b1af0a099551d..6353c19d319c6 100644
--- a/drivers/gpu/drm/nova/driver.rs
+++ b/drivers/gpu/drm/nova/driver.rs
@@ -68,6 +68,7 @@ impl drm::Driver for NovaDriver {
     type Data = NovaData;
     type File = File;
     type Object = gem::Object<NovaObject>;
+    type ThisModule = super::DriverModule;
 
     const INFO: drm::DriverInfo = INFO;
 

-- 
2.43.0



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 5/8] gpu: tyr: implement `ThisModule`
  2026-05-19  6:26 [PATCH 0/8] Fix missing fops.owner in Rust DRM/misc abstractions Alvin Sun
                   ` (3 preceding siblings ...)
  2026-05-19  6:26 ` [PATCH 4/8] gpu: nova: implement `ThisModule` Alvin Sun
@ 2026-05-19  6:26 ` Alvin Sun
  2026-05-19  6:26 ` [PATCH 6/8] rust: drm: set fops.owner from driver module pointer Alvin Sun
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Alvin Sun @ 2026-05-19  6:26 UTC (permalink / raw)
  To: Miguel Ojeda, Boqun Feng, Gary Guo, Björn Roy Baron,
	Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross,
	Danilo Krummrich, Luis Chamberlain, Petr Pavlu, Daniel Gomez,
	Sami Tolvanen, Aaron Tomlin, Greg Kroah-Hartman,
	Rafael J. Wysocki, David Airlie, Simona Vetter, Daniel Almeida,
	Arnd Bergmann
  Cc: rust-for-linux, linux-kernel, linux-modules, driver-core,
	dri-devel, nova-gpu, Alvin Sun

Set `ThisModule = super::DriverModule` to provide the correct module
pointer for file operations ownership.

Signed-off-by: Alvin Sun <alvin.sun@linux.dev>
---
 drivers/gpu/drm/tyr/driver.rs | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/tyr/driver.rs b/drivers/gpu/drm/tyr/driver.rs
index 279710b36a104..9eb4561ab831d 100644
--- a/drivers/gpu/drm/tyr/driver.rs
+++ b/drivers/gpu/drm/tyr/driver.rs
@@ -176,6 +176,7 @@ impl drm::Driver for TyrDrmDriver {
     type Data = TyrDrmDeviceData;
     type File = TyrDrmFileData;
     type Object = drm::gem::Object<TyrObject>;
+    type ThisModule = super::DriverModule;
 
     const INFO: drm::DriverInfo = INFO;
 

-- 
2.43.0



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 6/8] rust: drm: set fops.owner from driver module pointer
  2026-05-19  6:26 [PATCH 0/8] Fix missing fops.owner in Rust DRM/misc abstractions Alvin Sun
                   ` (4 preceding siblings ...)
  2026-05-19  6:26 ` [PATCH 5/8] gpu: tyr: " Alvin Sun
@ 2026-05-19  6:26 ` Alvin Sun
  2026-05-19  6:26 ` [PATCH 7/8] rust: miscdevice: add `ThisModule` associated type to `MiscDevice` trait Alvin Sun
  2026-05-19  6:26 ` [PATCH 8/8] samples: rust: rust_misc_device: implement `ThisModule` for `RustMiscDevice` Alvin Sun
  7 siblings, 0 replies; 12+ messages in thread
From: Alvin Sun @ 2026-05-19  6:26 UTC (permalink / raw)
  To: Miguel Ojeda, Boqun Feng, Gary Guo, Björn Roy Baron,
	Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross,
	Danilo Krummrich, Luis Chamberlain, Petr Pavlu, Daniel Gomez,
	Sami Tolvanen, Aaron Tomlin, Greg Kroah-Hartman,
	Rafael J. Wysocki, David Airlie, Simona Vetter, Daniel Almeida,
	Arnd Bergmann
  Cc: rust-for-linux, linux-kernel, linux-modules, driver-core,
	dri-devel, nova-gpu, Alvin Sun

Change `create_fops()` to accept an owner module pointer instead of
hardcoding `null_mut()`, ensuring the kernel correctly tracks the
module owning the DRM device's file operations.

Signed-off-by: Alvin Sun <alvin.sun@linux.dev>
---
 rust/kernel/drm/device.rs  | 3 ++-
 rust/kernel/drm/gem/mod.rs | 4 ++--
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/rust/kernel/drm/device.rs b/rust/kernel/drm/device.rs
index 403fc35353c74..97bee53823346 100644
--- a/rust/kernel/drm/device.rs
+++ b/rust/kernel/drm/device.rs
@@ -111,7 +111,8 @@ impl<T: drm::Driver> Device<T> {
         fops: &Self::GEM_FOPS,
     };
 
-    const GEM_FOPS: bindings::file_operations = drm::gem::create_fops();
+    const GEM_FOPS: bindings::file_operations =
+        drm::gem::create_fops(<T::ThisModule as crate::ModuleMetadata>::MODULE_PTR);
 
     /// Create a new `drm::Device` for a `drm::Driver`.
     pub fn new(dev: &device::Device, data: impl PinInit<T::Data, Error>) -> Result<ARef<Self>> {
diff --git a/rust/kernel/drm/gem/mod.rs b/rust/kernel/drm/gem/mod.rs
index 01b5bd47a3332..9a203efc59116 100644
--- a/rust/kernel/drm/gem/mod.rs
+++ b/rust/kernel/drm/gem/mod.rs
@@ -357,10 +357,10 @@ impl<T: DriverObject> AllocImpl for Object<T> {
     };
 }
 
-pub(super) const fn create_fops() -> bindings::file_operations {
+pub(super) const fn create_fops(owner: *mut bindings::module) -> bindings::file_operations {
     let mut fops: bindings::file_operations = pin_init::zeroed();
 
-    fops.owner = core::ptr::null_mut();
+    fops.owner = owner;
     fops.open = Some(bindings::drm_open);
     fops.release = Some(bindings::drm_release);
     fops.unlocked_ioctl = Some(bindings::drm_ioctl);

-- 
2.43.0



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 7/8] rust: miscdevice: add `ThisModule` associated type to `MiscDevice` trait
  2026-05-19  6:26 [PATCH 0/8] Fix missing fops.owner in Rust DRM/misc abstractions Alvin Sun
                   ` (5 preceding siblings ...)
  2026-05-19  6:26 ` [PATCH 6/8] rust: drm: set fops.owner from driver module pointer Alvin Sun
@ 2026-05-19  6:26 ` Alvin Sun
  2026-05-19  6:26 ` [PATCH 8/8] samples: rust: rust_misc_device: implement `ThisModule` for `RustMiscDevice` Alvin Sun
  7 siblings, 0 replies; 12+ messages in thread
From: Alvin Sun @ 2026-05-19  6:26 UTC (permalink / raw)
  To: Miguel Ojeda, Boqun Feng, Gary Guo, Björn Roy Baron,
	Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross,
	Danilo Krummrich, Luis Chamberlain, Petr Pavlu, Daniel Gomez,
	Sami Tolvanen, Aaron Tomlin, Greg Kroah-Hartman,
	Rafael J. Wysocki, David Airlie, Simona Vetter, Daniel Almeida,
	Arnd Bergmann
  Cc: rust-for-linux, linux-kernel, linux-modules, driver-core,
	dri-devel, nova-gpu, Alvin Sun

Add a `ThisModule` associated type bound by `ModuleMetadata` to the
`MiscDevice` trait, and use it to set the miscdevice fops owner field
instead of defaulting to null.

Signed-off-by: Alvin Sun <alvin.sun@linux.dev>
---
 rust/kernel/miscdevice.rs | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/rust/kernel/miscdevice.rs b/rust/kernel/miscdevice.rs
index 05a6b6b9770f2..007caaae62697 100644
--- a/rust/kernel/miscdevice.rs
+++ b/rust/kernel/miscdevice.rs
@@ -38,6 +38,7 @@
         ForeignOwnable,
         Opaque, //
     },
+    ModuleMetadata, //
 };
 use core::{
     marker::PhantomData,
@@ -137,6 +138,9 @@ pub trait MiscDevice: Sized {
     /// What kind of pointer should `Self` be wrapped in.
     type Ptr: ForeignOwnable + Send + Sync;
 
+    /// The module implementing this driver.
+    type ThisModule: ModuleMetadata;
+
     /// Called when the misc device is opened.
     ///
     /// The returned pointer will be stored as the private data for the file.
@@ -441,6 +445,7 @@ impl<T: MiscDevice> MiscdeviceVTable<T> {
         } else {
             None
         },
+        owner: <T::ThisModule as ModuleMetadata>::MODULE_PTR,
         ..pin_init::zeroed()
     };
 

-- 
2.43.0



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 8/8] samples: rust: rust_misc_device: implement `ThisModule` for `RustMiscDevice`
  2026-05-19  6:26 [PATCH 0/8] Fix missing fops.owner in Rust DRM/misc abstractions Alvin Sun
                   ` (6 preceding siblings ...)
  2026-05-19  6:26 ` [PATCH 7/8] rust: miscdevice: add `ThisModule` associated type to `MiscDevice` trait Alvin Sun
@ 2026-05-19  6:26 ` Alvin Sun
  7 siblings, 0 replies; 12+ messages in thread
From: Alvin Sun @ 2026-05-19  6:26 UTC (permalink / raw)
  To: Miguel Ojeda, Boqun Feng, Gary Guo, Björn Roy Baron,
	Benno Lossin, Andreas Hindborg, Alice Ryhl, Trevor Gross,
	Danilo Krummrich, Luis Chamberlain, Petr Pavlu, Daniel Gomez,
	Sami Tolvanen, Aaron Tomlin, Greg Kroah-Hartman,
	Rafael J. Wysocki, David Airlie, Simona Vetter, Daniel Almeida,
	Arnd Bergmann
  Cc: rust-for-linux, linux-kernel, linux-modules, driver-core,
	dri-devel, nova-gpu, Alvin Sun

Set `ThisModule = RustMiscDeviceModule` to provide the correct module
pointer for file operations ownership.

Signed-off-by: Alvin Sun <alvin.sun@linux.dev>
---
 samples/rust/rust_misc_device.rs | 1 +
 1 file changed, 1 insertion(+)

diff --git a/samples/rust/rust_misc_device.rs b/samples/rust/rust_misc_device.rs
index 41e26c825060b..a4b012a35b5ec 100644
--- a/samples/rust/rust_misc_device.rs
+++ b/samples/rust/rust_misc_device.rs
@@ -176,6 +176,7 @@ struct RustMiscDevice {
 #[vtable]
 impl MiscDevice for RustMiscDevice {
     type Ptr = Pin<KBox<Self>>;
+    type ThisModule = RustMiscDeviceModule;
 
     fn open(_file: &File, misc: &MiscDeviceRegistration<Self>) -> Result<Pin<KBox<Self>>> {
         let dev = ARef::from(misc.device());

-- 
2.43.0



^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/8] rust: driver: make `DriverModule` struct pub(crate) in `module_driver!`
  2026-05-19  6:26 ` [PATCH 2/8] rust: driver: make `DriverModule` struct pub(crate) in `module_driver!` Alvin Sun
@ 2026-05-19 11:53   ` Gary Guo
  0 siblings, 0 replies; 12+ messages in thread
From: Gary Guo @ 2026-05-19 11:53 UTC (permalink / raw)
  To: Alvin Sun, Miguel Ojeda, Boqun Feng, Gary Guo,
	Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl,
	Trevor Gross, Danilo Krummrich, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Greg Kroah-Hartman,
	Rafael J. Wysocki, David Airlie, Simona Vetter, Daniel Almeida,
	Arnd Bergmann
  Cc: rust-for-linux, linux-kernel, linux-modules, driver-core,
	dri-devel, nova-gpu

On Tue May 19, 2026 at 7:26 AM BST, Alvin Sun wrote:
> Expose the generated `DriverModule` struct as `pub(crate)` so that
> driver implementations can reference it via `super::DriverModule`
> for the `ThisModule` associated type.

Why is this needed? Child modules can see items super modules.

Best,
Gary

>
> Signed-off-by: Alvin Sun <alvin.sun@linux.dev>
> ---
>  rust/kernel/driver.rs | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/rust/kernel/driver.rs b/rust/kernel/driver.rs
> index 36de8098754d0..9c7c69c4d2af0 100644
> --- a/rust/kernel/driver.rs
> +++ b/rust/kernel/driver.rs
> @@ -253,7 +253,7 @@ macro_rules! module_driver {
>          type Ops<$gen_type> = $driver_ops;
>  
>          #[$crate::prelude::pin_data]
> -        struct DriverModule {
> +        pub(crate) struct DriverModule {
>              #[pin]
>              _driver: $crate::driver::Registration<Ops<$type>>,
>          }


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 1/8] rust: module: add `MODULE_PTR` const to `ModuleMetadata` trait
  2026-05-19  6:26 ` [PATCH 1/8] rust: module: add `MODULE_PTR` const to `ModuleMetadata` trait Alvin Sun
@ 2026-05-19 11:57   ` Gary Guo
  0 siblings, 0 replies; 12+ messages in thread
From: Gary Guo @ 2026-05-19 11:57 UTC (permalink / raw)
  To: Alvin Sun, Miguel Ojeda, Boqun Feng, Gary Guo,
	Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl,
	Trevor Gross, Danilo Krummrich, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Greg Kroah-Hartman,
	Rafael J. Wysocki, David Airlie, Simona Vetter, Daniel Almeida,
	Arnd Bergmann
  Cc: rust-for-linux, linux-kernel, linux-modules, driver-core,
	dri-devel, nova-gpu

On Tue May 19, 2026 at 7:26 AM BST, Alvin Sun wrote:
> Add a `MODULE_PTR` const to the `ModuleMetadata` trait so that
> modules can provide a constant pointer to their `struct module`
> usable in const contexts such as static file_operations.

Please design a consistent API surface that integrates with the `THIS_MODULE`
that we have today, and avoid two ways of doing things.

Best,
Gary

>
> Signed-off-by: Alvin Sun <alvin.sun@linux.dev>
> ---
>  rust/kernel/lib.rs    |  3 +++
>  rust/macros/module.rs | 14 ++++++++++++++
>  2 files changed, 17 insertions(+)
>
> diff --git a/rust/kernel/lib.rs b/rust/kernel/lib.rs
> index b72b2fbe046d6..c7e809636e1a9 100644
> --- a/rust/kernel/lib.rs
> +++ b/rust/kernel/lib.rs
> @@ -184,6 +184,9 @@ fn init(module: &'static ThisModule) -> impl pin_init::PinInit<Self, error::Erro
>  pub trait ModuleMetadata {
>      /// The name of the module as specified in the `module!` macro.
>      const NAME: &'static crate::str::CStr;
> +
> +    /// The pointer to the kernel `struct module` for this module.
> +    const MODULE_PTR: *mut bindings::module;
>  }
>  
>  /// Equivalent to `THIS_MODULE` in the C API.
> diff --git a/rust/macros/module.rs b/rust/macros/module.rs
> index 06c18e2075083..7204fe604f24a 100644
> --- a/rust/macros/module.rs
> +++ b/rust/macros/module.rs
> @@ -519,6 +519,20 @@ pub(crate) fn module(info: ModuleInfo) -> Result<TokenStream> {
>  
>          impl ::kernel::ModuleMetadata for #type_ {
>              const NAME: &'static ::kernel::str::CStr = #name_cstr;
> +
> +            #[cfg(MODULE)]
> +            const MODULE_PTR: *mut ::kernel::bindings::module = {
> +                extern "C" {
> +                    static __this_module: ::kernel::types::Opaque<::kernel::bindings::module>;
> +                }
> +
> +                // SAFETY: `__this_module` is constructed by the kernel at load time
> +                // and lives until the module is unloaded.
> +                unsafe { __this_module.get() }
> +            };
> +
> +            #[cfg(not(MODULE))]
> +            const MODULE_PTR: *mut ::kernel::bindings::module = ::core::ptr::null_mut();
>          }
>  
>          // Double nested modules, since then nobody can access the public items inside.


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 3/8] rust: drm: add `ThisModule` associated type to `Driver` trait
  2026-05-19  6:26 ` [PATCH 3/8] rust: drm: add `ThisModule` associated type to `Driver` trait Alvin Sun
@ 2026-05-19 11:58   ` Gary Guo
  0 siblings, 0 replies; 12+ messages in thread
From: Gary Guo @ 2026-05-19 11:58 UTC (permalink / raw)
  To: Alvin Sun, Miguel Ojeda, Boqun Feng, Gary Guo,
	Björn Roy Baron, Benno Lossin, Andreas Hindborg, Alice Ryhl,
	Trevor Gross, Danilo Krummrich, Luis Chamberlain, Petr Pavlu,
	Daniel Gomez, Sami Tolvanen, Aaron Tomlin, Greg Kroah-Hartman,
	Rafael J. Wysocki, David Airlie, Simona Vetter, Daniel Almeida,
	Arnd Bergmann
  Cc: rust-for-linux, linux-kernel, linux-modules, driver-core,
	dri-devel, nova-gpu

On Tue May 19, 2026 at 7:26 AM BST, Alvin Sun wrote:
> Add a `ThisModule` associated type bound by `ModuleMetadata` to the
> `drm::Driver` trait, allowing DRM drivers to expose their module
> pointer for use in file operations.

FWIW, I was considering adding this automatically to the `#[vtable]` macro
(associated types/consts won't have any costs if they're unused anyway).

But requiring an explicit specification isn't too bad either.

Best,
Gary

>
> Signed-off-by: Alvin Sun <alvin.sun@linux.dev>
> ---
>  rust/kernel/drm/driver.rs | 3 +++
>  1 file changed, 3 insertions(+)
>
> diff --git a/rust/kernel/drm/driver.rs b/rust/kernel/drm/driver.rs
> index 5233bdebc9fcd..c798961650c1a 100644
> --- a/rust/kernel/drm/driver.rs
> +++ b/rust/kernel/drm/driver.rs
> @@ -115,6 +115,9 @@ pub trait Driver {
>  
>      /// IOCTL list. See `kernel::drm::ioctl::declare_drm_ioctls!{}`.
>      const IOCTLS: &'static [drm::ioctl::DrmIoctlDescriptor];
> +
> +    /// The module implementing this driver.
> +    type ThisModule: crate::ModuleMetadata;
>  }
>  
>  /// The registration type of a `drm::Device`.


^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2026-05-19 11:58 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-05-19  6:26 [PATCH 0/8] Fix missing fops.owner in Rust DRM/misc abstractions Alvin Sun
2026-05-19  6:26 ` [PATCH 1/8] rust: module: add `MODULE_PTR` const to `ModuleMetadata` trait Alvin Sun
2026-05-19 11:57   ` Gary Guo
2026-05-19  6:26 ` [PATCH 2/8] rust: driver: make `DriverModule` struct pub(crate) in `module_driver!` Alvin Sun
2026-05-19 11:53   ` Gary Guo
2026-05-19  6:26 ` [PATCH 3/8] rust: drm: add `ThisModule` associated type to `Driver` trait Alvin Sun
2026-05-19 11:58   ` Gary Guo
2026-05-19  6:26 ` [PATCH 4/8] gpu: nova: implement `ThisModule` Alvin Sun
2026-05-19  6:26 ` [PATCH 5/8] gpu: tyr: " Alvin Sun
2026-05-19  6:26 ` [PATCH 6/8] rust: drm: set fops.owner from driver module pointer Alvin Sun
2026-05-19  6:26 ` [PATCH 7/8] rust: miscdevice: add `ThisModule` associated type to `MiscDevice` trait Alvin Sun
2026-05-19  6:26 ` [PATCH 8/8] samples: rust: rust_misc_device: implement `ThisModule` for `RustMiscDevice` Alvin Sun

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox