Skip to content

Commit 6459afd

Browse files
committed
fixup! rust: drm: Add GPUVM Manager abstraction
Signed-off-by: Janne Grunau <j@jannau.net>
1 parent cb174f0 commit 6459afd

1 file changed

Lines changed: 64 additions & 51 deletions

File tree

rust/kernel/drm/gpuvm.rs

Lines changed: 64 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#![allow(missing_docs)]
88

99
use crate::{
10+
alloc::flags::*,
1011
bindings,
1112
drm::{device, drv},
1213
error::{
@@ -186,11 +187,14 @@ impl<T: DriverGpuVm> GpuVa<T> {
186187
where
187188
Error: From<E>,
188189
{
189-
Box::try_pin_init(try_pin_init!(Self {
190-
gpuva <- init::zeroed(),
191-
inner <- inner,
192-
_p: PhantomPinned
193-
}))
190+
Box::try_pin_init(
191+
try_pin_init!(Self {
192+
gpuva <- init::zeroed(),
193+
inner <- inner,
194+
_p: PhantomPinned
195+
}),
196+
GFP_KERNEL,
197+
)
194198
}
195199

196200
pub fn addr(&self) -> u64 {
@@ -285,11 +289,14 @@ pub(super) unsafe extern "C" fn vm_free_callback<T: DriverGpuVm>(
285289

286290
pub(super) unsafe extern "C" fn vm_bo_alloc_callback<T: DriverGpuVm>() -> *mut bindings::drm_gpuvm_bo
287291
{
288-
let obj: Result<Pin<Box<GpuVmBo<T>>>> = Box::try_pin_init(try_pin_init!(GpuVmBo::<T> {
289-
bo <- init::default(),
290-
inner <- T::GpuVmBo::new(),
291-
_p: PhantomPinned
292-
}));
292+
let obj: Result<Pin<Box<GpuVmBo<T>>>> = Box::try_pin_init(
293+
try_pin_init!(GpuVmBo::<T> {
294+
bo <- init::default(),
295+
inner <- T::GpuVmBo::new(),
296+
_p: PhantomPinned
297+
}),
298+
GFP_KERNEL,
299+
);
293300

294301
match obj {
295302
Ok(obj) =>
@@ -395,35 +402,38 @@ impl<T: DriverGpuVm> GpuVm<T> {
395402
where
396403
Error: From<E>,
397404
{
398-
let obj: Pin<Box<Self>> = Box::try_pin_init(try_pin_init!(Self {
399-
// SAFETY: drm_gpuvm_init cannot fail and always initializes the member
400-
gpuvm <- unsafe {
401-
init::pin_init_from_closure(move |slot: *mut Opaque<bindings::drm_gpuvm> | {
402-
// Zero-init required by drm_gpuvm_init
403-
*slot = Opaque::zeroed();
404-
bindings::drm_gpuvm_init(
405-
Opaque::raw_get(slot),
406-
name.as_char_ptr(),
407-
0,
408-
dev.raw_mut(),
409-
r_obj.gem_obj() as *const _ as *mut _,
410-
range.start,
411-
range.end - range.start,
412-
reserve_range.start,
413-
reserve_range.end - reserve_range.start,
414-
&Self::OPS
415-
);
416-
Ok(())
417-
})
418-
},
419-
// SAFETY: Just passing through to the initializer argument
420-
inner <- unsafe {
421-
init::pin_init_from_closure(move |slot: *mut UnsafeCell<T> | {
422-
inner.__pinned_init(slot as *mut _)
423-
})
424-
},
425-
_p: PhantomPinned
426-
}))?;
405+
let obj: Pin<Box<Self>> = Box::try_pin_init(
406+
try_pin_init!(Self {
407+
// SAFETY: drm_gpuvm_init cannot fail and always initializes the member
408+
gpuvm <- unsafe {
409+
init::pin_init_from_closure(move |slot: *mut Opaque<bindings::drm_gpuvm> | {
410+
// Zero-init required by drm_gpuvm_init
411+
*slot = Opaque::zeroed();
412+
bindings::drm_gpuvm_init(
413+
Opaque::raw_get(slot),
414+
name.as_char_ptr(),
415+
0,
416+
dev.raw_mut(),
417+
r_obj.gem_obj() as *const _ as *mut _,
418+
range.start,
419+
range.end - range.start,
420+
reserve_range.start,
421+
reserve_range.end - reserve_range.start,
422+
&Self::OPS
423+
);
424+
Ok(())
425+
})
426+
},
427+
// SAFETY: Just passing through to the initializer argument
428+
inner <- unsafe {
429+
init::pin_init_from_closure(move |slot: *mut UnsafeCell<T> | {
430+
inner.__pinned_init(slot as *mut _)
431+
})
432+
},
433+
_p: PhantomPinned
434+
}),
435+
GFP_KERNEL,
436+
)?;
427437

428438
// SAFETY: We never move out of the object
429439
let vm_ref = unsafe {
@@ -445,19 +455,22 @@ impl<T: DriverGpuVm> GpuVm<T> {
445455
let mut guard = ManuallyDrop::new(LockedGpuVm {
446456
gpuvm: self,
447457
// vm_exec needs to be pinned, so stick it in a Box.
448-
vm_exec: Box::init(init!(bindings::drm_gpuvm_exec {
449-
vm: self.gpuvm() as *mut _,
450-
flags: bindings::BINDINGS_DRM_EXEC_INTERRUPTIBLE_WAIT,
451-
exec: Default::default(),
452-
extra: match (is_ext, obj) {
453-
(true, Some(obj)) => bindings::drm_gpuvm_exec__bindgen_ty_1 {
454-
fn_: Some(exec_lock_gem_object),
455-
priv_: obj.gem_obj() as *const _ as *mut _,
458+
vm_exec: Box::init(
459+
init!(bindings::drm_gpuvm_exec {
460+
vm: self.gpuvm() as *mut _,
461+
flags: bindings::BINDINGS_DRM_EXEC_INTERRUPTIBLE_WAIT,
462+
exec: Default::default(),
463+
extra: match (is_ext, obj) {
464+
(true, Some(obj)) => bindings::drm_gpuvm_exec__bindgen_ty_1 {
465+
fn_: Some(exec_lock_gem_object),
466+
priv_: obj.gem_obj() as *const _ as *mut _,
467+
},
468+
_ => Default::default(),
456469
},
457-
_ => Default::default(),
458-
},
459-
num_fences: 0,
460-
}))?,
470+
num_fences: 0,
471+
}),
472+
GFP_KERNEL,
473+
)?,
461474
obj,
462475
});
463476

0 commit comments

Comments
 (0)