diff --git a/rust/kernel/drm/gpuvm.rs b/rust/kernel/drm/gpuvm.rs index 47fd4fbc17ebe8a029cc59e688dcb9467a3b230c..764b48fcae57c0f8ed0c668dbbf4fb8014563f6f 100644 --- a/rust/kernel/drm/gpuvm.rs +++ b/rust/kernel/drm/gpuvm.rs @@ -7,7 +7,6 @@ #![allow(missing_docs)] use crate::{ - alloc::flags::*, bindings, drm::{device, drv}, error::{ @@ -91,28 +90,24 @@ impl<T: DriverGpuVm> OpMap<T> { self.0.gem.offset } pub fn object(&self) -> &<T::Driver as drv::Driver>::Object { - // SAFETY: The GEM object is only ever passed as a Driver object below, so - // the type must be correct. - let p = unsafe { - <<T::Driver as drv::Driver>::Object as IntoGEMObject>::from_gem_obj(self.0.gem.obj) - }; + let p = <<T::Driver as drv::Driver>::Object as IntoGEMObject>::from_gem_obj(self.0.gem.obj); // SAFETY: The GEM object has an active reference for the lifetime of this op unsafe { &*p } } pub fn map_and_link_va( &mut self, gpuvm: &mut UpdatingGpuVm<'_, T>, - gpuva: Pin<Box<GpuVa<T>>>, + gpuva: Pin<KBox<GpuVa<T>>>, gpuvmbo: &ARef<GpuVmBo<T>>, - ) -> Result<(), Pin<Box<GpuVa<T>>>> { + ) -> Result<(), Pin<KBox<GpuVa<T>>>> { // SAFETY: We are handing off the GpuVa ownership and it will not be moved. - let p = Box::leak(unsafe { Pin::into_inner_unchecked(gpuva) }); + let p = KBox::leak(unsafe { Pin::into_inner_unchecked(gpuva) }); // SAFETY: These C functions are called with the correct invariants unsafe { bindings::drm_gpuva_init_from_op(&mut p.gpuva, &mut self.0); if bindings::drm_gpuva_insert(gpuvm.0.gpuvm() as *mut _, &mut p.gpuva) != 0 { // EEXIST, return the GpuVa to the caller as an error - return Err(Pin::new_unchecked(Box::from_raw(p))); + return Err(Pin::new_unchecked(KBox::from_raw(p))); }; // SAFETY: This takes a new reference to the gpuvmbo. bindings::drm_gpuva_link(&mut p.gpuva, &gpuvmbo.bo as *const _ as *mut _); @@ -131,7 +126,7 @@ impl<T: DriverGpuVm> OpUnMap<T> { // SAFETY: The GpuVa object reference is valid per the op_unmap contract Some(unsafe { &*p }) } - pub fn unmap_and_unlink_va(&mut self) -> Option<Pin<Box<GpuVa<T>>>> { + pub fn unmap_and_unlink_va(&mut self) -> Option<Pin<KBox<GpuVa<T>>>> { if self.0.va.is_null() { return None; } @@ -148,7 +143,7 @@ impl<T: DriverGpuVm> OpUnMap<T> { // so clear the pointer self.0.va = core::ptr::null_mut(); // SAFETY: The GpuVa object reference is valid per the op_unmap contract - Some(unsafe { Pin::new_unchecked(Box::from_raw(p)) }) + Some(unsafe { Pin::new_unchecked(KBox::from_raw(p)) }) } } @@ -183,11 +178,11 @@ pub struct GpuVa<T: DriverGpuVm> { unsafe impl init::Zeroable for bindings::drm_gpuva {} impl<T: DriverGpuVm> GpuVa<T> { - pub fn new<E>(inner: impl PinInit<T::GpuVa, E>) -> Result<Pin<Box<GpuVa<T>>>> + pub fn new<E>(inner: impl PinInit<T::GpuVa, E>) -> Result<Pin<KBox<GpuVa<T>>>> where Error: From<E>, { - Box::try_pin_init( + KBox::try_pin_init( try_pin_init!(Self { gpuva <- init::zeroed(), inner <- inner, @@ -284,12 +279,12 @@ pub(super) unsafe extern "C" fn vm_free_callback<T: DriverGpuVm>( }; // SAFETY: p is guaranteed to be valid for drm_gpuvm objects using this callback. - unsafe { drop(Box::from_raw(p)) }; + unsafe { drop(KBox::from_raw(p)) }; } pub(super) unsafe extern "C" fn vm_bo_alloc_callback<T: DriverGpuVm>() -> *mut bindings::drm_gpuvm_bo { - let obj: Result<Pin<Box<GpuVmBo<T>>>> = Box::try_pin_init( + let obj: Result<Pin<KBox<GpuVmBo<T>>>> = KBox::try_pin_init( try_pin_init!(GpuVmBo::<T> { bo <- init::default(), inner <- T::GpuVmBo::new(), @@ -302,7 +297,7 @@ pub(super) unsafe extern "C" fn vm_bo_alloc_callback<T: DriverGpuVm>() -> *mut b Ok(obj) => // SAFETY: The DRM core will keep this object pinned unsafe { - let p = Box::leak(Pin::into_inner_unchecked(obj)); + let p = KBox::leak(Pin::into_inner_unchecked(obj)); &mut p.bo }, Err(_) => core::ptr::null_mut(), @@ -316,7 +311,7 @@ pub(super) unsafe extern "C" fn vm_bo_free_callback<T: DriverGpuVm>( let p = unsafe { crate::container_of!(raw_vm_bo, GpuVmBo<T>, bo) as *mut GpuVmBo<T> }; // SAFETY: p is guaranteed to be valid for drm_gpuvm_bo objects using this callback. - unsafe { drop(Box::from_raw(p)) }; + unsafe { drop(KBox::from_raw(p)) }; } pub(super) unsafe extern "C" fn step_map_callback<T: DriverGpuVm>( @@ -402,7 +397,7 @@ impl<T: DriverGpuVm> GpuVm<T> { where Error: From<E>, { - let obj: Pin<Box<Self>> = Box::try_pin_init( + let obj: Pin<KBox<Self>> = KBox::try_pin_init( try_pin_init!(Self { // SAFETY: drm_gpuvm_init cannot fail and always initializes the member gpuvm <- unsafe { @@ -413,7 +408,7 @@ impl<T: DriverGpuVm> GpuVm<T> { Opaque::raw_get(slot), name.as_char_ptr(), 0, - dev.raw_mut(), + dev.as_raw(), r_obj.gem_obj() as *const _ as *mut _, range.start, range.end - range.start, @@ -437,7 +432,7 @@ impl<T: DriverGpuVm> GpuVm<T> { // SAFETY: We never move out of the object let vm_ref = unsafe { - ARef::from_raw(NonNull::new_unchecked(Box::leak( + ARef::from_raw(NonNull::new_unchecked(KBox::leak( Pin::into_inner_unchecked(obj), ))) }; @@ -455,7 +450,7 @@ impl<T: DriverGpuVm> GpuVm<T> { let mut guard = ManuallyDrop::new(LockedGpuVm { gpuvm: self, // vm_exec needs to be pinned, so stick it in a Box. - vm_exec: Box::init( + vm_exec: KBox::init( init!(bindings::drm_gpuvm_exec { vm: self.gpuvm() as *mut _, flags: bindings::BINDINGS_DRM_EXEC_INTERRUPTIBLE_WAIT, @@ -505,7 +500,7 @@ unsafe impl<T: DriverGpuVm> AlwaysRefCounted for GpuVm<T> { pub struct LockedGpuVm<'a, 'b, T: DriverGpuVm> { gpuvm: &'a GpuVm<T>, - vm_exec: Box<bindings::drm_gpuvm_exec>, + vm_exec: KBox<bindings::drm_gpuvm_exec>, obj: Option<&'b <T::Driver as drv::Driver>::Object>, } @@ -652,8 +647,6 @@ impl<T: DriverGpuVm> DerefMut for UpdatingGpuVm<'_, T> { } } -impl<T: DriverGpuVm> core::ops::Receiver for UpdatingGpuVm<'_, T> {} - // SAFETY: All our trait methods take locks unsafe impl<T: DriverGpuVm> Sync for GpuVm<T> {} // SAFETY: All our trait methods take locks