[PATCH 7/7] rust: drm: return impl PinInit from DriverFile::open()
From: Danilo Krummrich
Date: Fri Aug 14 2026 - 19:11:02 EST
Change DriverFile::open() to return impl PinInit<Self, Error> instead of
Result<Pin<KBox<Self>>>, consistent with how bus device private data
works.
Drivers no longer need to allocate a Pin<KBox<_>> themselves; they just
return an initializer and the subsystem takes care of the allocation.
Signed-off-by: Danilo Krummrich <dakr@xxxxxxxxxx>
---
drivers/gpu/drm/nova/file.rs | 4 ++--
drivers/gpu/drm/tyr/file.rs | 4 ++--
rust/kernel/drm/file.rs | 7 ++++---
rust/kernel/drm/gem/shmem.rs | 4 ++--
4 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/drivers/gpu/drm/nova/file.rs b/drivers/gpu/drm/nova/file.rs
index 1f94201af92b..30bbabe6ee78 100644
--- a/drivers/gpu/drm/nova/file.rs
+++ b/drivers/gpu/drm/nova/file.rs
@@ -20,8 +20,8 @@
impl drm::file::DriverFile<'_> for File {
type Driver = NovaDriver;
- fn open(_device: &NovaDevice<Registered>, _reg_data: &()) -> Result<Pin<KBox<Self>>> {
- Ok(KBox::new(Self, GFP_KERNEL)?.into())
+ fn open(_device: &NovaDevice<Registered>, _reg_data: &()) -> impl PinInit<Self, Error> {
+ Ok(Self)
}
}
diff --git a/drivers/gpu/drm/tyr/file.rs b/drivers/gpu/drm/tyr/file.rs
index 0e0878090de6..933a365cb016 100644
--- a/drivers/gpu/drm/tyr/file.rs
+++ b/drivers/gpu/drm/tyr/file.rs
@@ -28,8 +28,8 @@ impl drm::file::DriverFile<'_> for TyrDrmFileData {
fn open(
_device: &TyrDrmDevice<Registered>,
_reg_data: &TyrDrmRegistrationData<'_>,
- ) -> Result<Pin<KBox<Self>>> {
- KBox::try_pin_init(try_pin_init!(Self {}), GFP_KERNEL)
+ ) -> impl PinInit<Self, Error> {
+ Ok(Self {})
}
}
diff --git a/rust/kernel/drm/file.rs b/rust/kernel/drm/file.rs
index 6491ec5707a0..31fc318eb535 100644
--- a/rust/kernel/drm/file.rs
+++ b/rust/kernel/drm/file.rs
@@ -30,12 +30,12 @@ pub trait DriverFile<'a>: Sized {
/// Open a new DRM file, creating the per-file driver data.
///
- /// Called when a client opens the DRM device. The returned file data may borrow from
+ /// Called when a client opens the DRM device. The returned initializer may borrow from
/// `reg_data` with lifetime `'a`.
fn open(
device: &drm::Device<Self::Driver, drm::Registered>,
reg_data: &'a <Self::Driver as drm::Driver>::RegistrationData<'a>,
- ) -> Result<Pin<KBox<Self>>>;
+ ) -> impl PinInit<Self, Error>;
}
/// An open DRM File.
@@ -107,7 +107,8 @@ pub(crate) extern "C" fn open_callback(
unsafe { drm::device::Device::from_raw(raw_dev) };
dev.registration_data_with(|reg_data| {
- let inner = match <<D::File as ForLt>::Of<'_> as DriverFile<'_>>::open(dev, reg_data) {
+ let init = <<D::File as ForLt>::Of<'_> as DriverFile<'_>>::open(dev, reg_data);
+ let inner = match KBox::try_pin_init(init, GFP_KERNEL) {
Err(e) => return e.to_errno(),
Ok(i) => i,
};
diff --git a/rust/kernel/drm/gem/shmem.rs b/rust/kernel/drm/gem/shmem.rs
index 793b4883de3a..d882b505fe0f 100644
--- a/rust/kernel/drm/gem/shmem.rs
+++ b/rust/kernel/drm/gem/shmem.rs
@@ -611,8 +611,8 @@ impl drm::file::DriverFile<'_> for KunitFile {
fn open(
_device: &drm::Device<KunitDriver, drm::Registered>,
_reg_data: &(),
- ) -> Result<Pin<KBox<Self>>> {
- Ok(KBox::new(Self, GFP_KERNEL)?.into())
+ ) -> impl PinInit<Self, Error> {
+ Ok(Self)
}
}
--
2.55.0