On Sun Jun 28, 2026 at 11:53 PM JST, Danilo Krummrich wrote: > Ioctl handlers now receive a &Device<T, Registered> reference, proving > at the type level that the device is registered and its parent bus > device is bound.
nit: the non-imperative style makes it sound a bit like this is the pre-patch state. Maybe change to something like "Make ioctl handlers receive...". > > This is achieved by calling registration_guard() on the Device<T, Ioctl> > obtained in ioctl dispatch context. If the device has been unplugged, > the ioctl returns -ENODEV without calling the handler. > > To resolve the driver type parameter T for type inference, which the > compiler cannot propagate through method resolution and associated-type > projections alone, a dead-code closure and a helper function are used as > a type-inference anchor. > > Reviewed-by: Lyude Paul <[email protected]> > Signed-off-by: Danilo Krummrich <[email protected]> > --- > drivers/gpu/drm/nova/file.rs | 12 ++++++---- > drivers/gpu/drm/tyr/file.rs | 7 ++++-- > rust/kernel/drm/ioctl.rs | 45 +++++++++++++++++++++++++++++++++--- > 3 files changed, 55 insertions(+), 9 deletions(-) > > diff --git a/drivers/gpu/drm/nova/file.rs b/drivers/gpu/drm/nova/file.rs > index a3b7bd36792c..19fb89b28984 100644 > --- a/drivers/gpu/drm/nova/file.rs > +++ b/drivers/gpu/drm/nova/file.rs > @@ -4,7 +4,11 @@ > use crate::gem::NovaObject; > use kernel::{ > alloc::flags::*, > - drm::{self, gem::BaseObject}, > + drm::{ > + self, > + gem::BaseObject, > + Registered, // > + }, > pci, > prelude::*, > uapi, > @@ -23,7 +27,7 @@ fn open(_dev: &NovaDevice) -> Result<Pin<KBox<Self>>> { > impl File { > /// IOCTL: get_param: Query GPU / driver metadata. > pub(crate) fn get_param( > - dev: &NovaDevice, > + dev: &NovaDevice<Registered>, > getparam: &mut uapi::drm_nova_getparam, > _file: &drm::File<File>, > ) -> Result<u32> { > @@ -43,7 +47,7 @@ pub(crate) fn get_param( > > /// IOCTL: gem_create: Create a new DRM GEM object. > pub(crate) fn gem_create( > - dev: &NovaDevice, > + dev: &NovaDevice<Registered>, > req: &mut uapi::drm_nova_gem_create, > file: &drm::File<File>, > ) -> Result<u32> { > @@ -56,7 +60,7 @@ pub(crate) fn gem_create( > > /// IOCTL: gem_info: Query GEM metadata. > pub(crate) fn gem_info( > - _dev: &NovaDevice, > + _dev: &NovaDevice<Registered>, > req: &mut uapi::drm_nova_gem_info, > file: &drm::File<File>, > ) -> Result<u32> { > diff --git a/drivers/gpu/drm/tyr/file.rs b/drivers/gpu/drm/tyr/file.rs > index 31411da203c5..fb9233eae01c 100644 > --- a/drivers/gpu/drm/tyr/file.rs > +++ b/drivers/gpu/drm/tyr/file.rs > @@ -1,7 +1,10 @@ > // SPDX-License-Identifier: GPL-2.0 or MIT > > use kernel::{ > - drm, > + drm::{ > + self, > + Registered, // > + }, > prelude::*, > uaccess::UserSlice, > uapi, // > @@ -28,7 +31,7 @@ fn open(_dev: &drm::Device<Self::Driver>) -> > Result<Pin<KBox<Self>>> { > > impl TyrDrmFileData { > pub(crate) fn dev_query( > - ddev: &TyrDrmDevice, > + ddev: &TyrDrmDevice<Registered>, > devquery: &mut uapi::drm_panthor_dev_query, > _file: &TyrDrmFile, > ) -> Result<u32> { > diff --git a/rust/kernel/drm/ioctl.rs b/rust/kernel/drm/ioctl.rs > index 6f5a9877bdae..f24cf7b146a8 100644 > --- a/rust/kernel/drm/ioctl.rs > +++ b/rust/kernel/drm/ioctl.rs > @@ -70,6 +70,18 @@ pub mod internal { > pub use bindings::drm_device; > pub use bindings::drm_file; > pub use bindings::drm_ioctl_desc; > + > + /// Reinterpret a pointer to a DRM device with a different > [`DeviceContext`], preserving the This sentence makes it sound like the origin and destination contexts are parameters, but this helper only does `Ioctl` to `Registered`. > + /// driver type parameter `T`. > + /// > + /// Used by [`declare_drm_ioctls!`] to anchor type inference. > + #[doc(hidden)] > + #[inline] > + pub const fn __dev_ctx_cast<T: crate::drm::Driver>( > + ptr: *const crate::drm::Device<T, crate::drm::Ioctl>, > + ) -> *const crate::drm::Device<T, crate::drm::Registered> { > + ptr.cast() > + } > } The points above really are nits though. Reviewed-by: Alexandre Courbot <[email protected]>
