From 05e647ea406967ee18ebc075cde67f0ba368917c Mon Sep 17 00:00:00 2001 From: Danilo Krummrich Date: Sat, 26 Sep 2026 14:43:26 +0200 Subject: gpu: nova-core: mm: get rid of Arc in BarUserAccess There is no need for a reference count here. BarUserAccess can just borrow from BarUser. Reviewed-by: Alexandre Courbot Link: https://patch.msgid.link/20260926124405.604707-4-dakr@kernel.org [ Update stale comment in run_self_test(). - Danilo ] Signed-off-by: Danilo Krummrich --- drivers/gpu/nova-core/mm/bar_user.rs | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/nova-core/mm/bar_user.rs b/drivers/gpu/nova-core/mm/bar_user.rs index 6c8fa06d9f4b..56caa6b26c41 100644 --- a/drivers/gpu/nova-core/mm/bar_user.rs +++ b/drivers/gpu/nova-core/mm/bar_user.rs @@ -7,10 +7,7 @@ use kernel::{ io::Io, new_mutex, prelude::*, - sync::{ - Arc, - Mutex, // - }, + sync::Mutex, // }; use crate::{ @@ -63,11 +60,11 @@ impl<'gpu> BarUser<'gpu> { /// Map physical pages to a contiguous BAR1 virtual range. pub(crate) fn map( - self: &Arc, + &self, mm: &mut GpuMm<'_>, pfns: &[Pfn], writable: bool, - ) -> Result> { + ) -> Result> { if pfns.is_empty() { return Err(EINVAL); } @@ -75,15 +72,17 @@ impl<'gpu> BarUser<'gpu> { 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>, +/// +/// 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, @@ -385,15 +384,10 @@ pub(crate) fn run_self_test( test3_passed = false; } - // Release Tests 1-3's Vmm before Test 4 constructs a fresh BarUser on - // the same PDB. + // Release Tests 1-3's Vmm before Test 4 uses the GPU's BarUser on the same PDB. 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. -- cgit v1.2.3