diff options
Diffstat (limited to 'rust/kernel/drm')
| -rw-r--r-- | rust/kernel/drm/device.rs | 14 | ||||
| -rw-r--r-- | rust/kernel/drm/driver.rs | 15 | 
2 files changed, 20 insertions, 9 deletions
| diff --git a/rust/kernel/drm/device.rs b/rust/kernel/drm/device.rs index 624d7a4c83ea..16935f42fe2e 100644 --- a/rust/kernel/drm/device.rs +++ b/rust/kernel/drm/device.rs @@ -66,7 +66,7 @@ impl<T: drm::Driver> Device<T> {          open: Some(drm::File::<T::File>::open_callback),          postclose: Some(drm::File::<T::File>::postclose_callback),          unload: None, -        release: None, +        release: Some(Self::release),          master_set: None,          master_drop: None,          debugfs_init: None, @@ -162,6 +162,16 @@ impl<T: drm::Driver> Device<T> {          // SAFETY: `ptr` is valid by the safety requirements of this function.          unsafe { &*ptr.cast() }      } + +    extern "C" fn release(ptr: *mut bindings::drm_device) { +        // SAFETY: `ptr` is a valid pointer to a `struct drm_device` and embedded in `Self`. +        let this = unsafe { Self::from_drm_device(ptr) }; + +        // SAFETY: +        // - When `release` runs it is guaranteed that there is no further access to `this`. +        // - `this` is valid for dropping. +        unsafe { core::ptr::drop_in_place(this) }; +    }  }  impl<T: drm::Driver> Deref for Device<T> { @@ -190,7 +200,7 @@ impl<T: drm::Driver> AsRef<device::Device> for Device<T> {      fn as_ref(&self) -> &device::Device {          // SAFETY: `bindings::drm_device::dev` is valid as long as the DRM device itself is valid,          // which is guaranteed by the type invariant. -        unsafe { device::Device::as_ref((*self.as_raw()).dev) } +        unsafe { device::Device::from_raw((*self.as_raw()).dev) }      }  } diff --git a/rust/kernel/drm/driver.rs b/rust/kernel/drm/driver.rs index acb638086131..fe7e8d06961a 100644 --- a/rust/kernel/drm/driver.rs +++ b/rust/kernel/drm/driver.rs @@ -5,12 +5,9 @@  //! C header: [`include/linux/drm/drm_drv.h`](srctree/include/linux/drm/drm_drv.h)  use crate::{ -    bindings, device, -    devres::Devres, -    drm, +    bindings, device, devres, drm,      error::{to_result, Result},      prelude::*, -    str::CStr,      types::ARef,  };  use macros::vtable; @@ -130,18 +127,22 @@ impl<T: Driver> Registration<T> {      }      /// Same as [`Registration::new`}, but transfers ownership of the [`Registration`] to -    /// [`Devres`]. +    /// [`devres::register`].      pub fn new_foreign_owned(          drm: &drm::Device<T>,          dev: &device::Device<device::Bound>,          flags: usize, -    ) -> Result { +    ) -> Result +    where +        T: 'static, +    {          if drm.as_ref().as_raw() != dev.as_raw() {              return Err(EINVAL);          }          let reg = Registration::<T>::new(drm, flags)?; -        Devres::new_foreign_owned(dev, reg, GFP_KERNEL) + +        devres::register(dev, reg, GFP_KERNEL)      }      /// Returns a reference to the `Device` instance for this registration. | 
