There is no need for a reference count here. BarUserAccess can just borrow from BarUser.
Signed-off-by: Danilo Krummrich <[email protected]> --- drivers/gpu/nova-core/mm/bar_user.rs | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/drivers/gpu/nova-core/mm/bar_user.rs b/drivers/gpu/nova-core/mm/bar_user.rs index 6c8fa06d9f4b..855244f06983 100644 --- a/drivers/gpu/nova-core/mm/bar_user.rs +++ b/drivers/gpu/nova-core/mm/bar_user.rs @@ -7,10 +7,7 @@ io::Io, new_mutex, prelude::*, - sync::{ - Arc, - Mutex, // - }, + sync::Mutex, // }; use crate::{ @@ -63,11 +60,11 @@ pub(crate) fn new( /// Map physical pages to a contiguous BAR1 virtual range. pub(crate) fn map( - self: &Arc<Self>, + &self, mm: &mut GpuMm<'_>, pfns: &[Pfn], writable: bool, - ) -> Result<BarUserAccess<'gpu>> { + ) -> Result<BarUserAccess<'_>> { if pfns.is_empty() { return Err(EINVAL); } @@ -75,15 +72,17 @@ pub(crate) fn map( let mapped = vmm.map_pages(mm, pfns, None, writable)?; Ok(BarUserAccess { - bar_user: self.clone(), + bar_user: self, mapped: Some(mapped), }) } } /// Access object for a mapped BAR1 region. -pub(crate) struct BarUserAccess<'gpu> { - bar_user: Arc<BarUser<'gpu>>, +/// +/// Borrows the [`BarUser`] managing the mapping for the lifetime of the access object. +pub(crate) struct BarUserAccess<'a> { + bar_user: &'a BarUser<'a>, /// [`BarUserAccess::release`] [`Option::take`]s this; `Some` at /// drop time means `release()` was never called. mapped: Option<MappedRange>, @@ -390,10 +389,6 @@ pub(crate) fn run_self_test( drop(vmm); // Test 4: Exercise `BarUser::map()` end-to-end. - let bar_user = Arc::pin_init( - BarUser::new(pdb_addr, chipset, SZ_64K.into_safe_cast(), bar1), - GFP_KERNEL, - )?; let access = bar_user.map(mm, &[test_pfn], true)?; // Write pattern via PRAMIN, read via BarUserAccess. -- 2.55.0
