From: Zhi Wang <[email protected]> Temporary BAR1 access needs a borrow of the GPU-owned BarUser. Store BarUser inline in Gpu and borrow it in BarUserAccess, avoiding a separate allocation and reference counting for these accesses. Update the existing self-test entry points to accept the borrowed interface.
No functional change is intended. Cc: Alistair Popple <[email protected]> Signed-off-by: Zhi Wang <[email protected]> Signed-off-by: Alok Kumar <[email protected]> --- drivers/gpu/nova-core/gpu.rs | 2 +- drivers/gpu/nova-core/mm/bar_user.rs | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs index 002c5ba134a6..98772868979d 100644 --- a/drivers/gpu/nova-core/gpu.rs +++ b/drivers/gpu/nova-core/gpu.rs @@ -666,7 +666,7 @@ pub(crate) fn run_selftests(self: Pin<&mut Self>, pdev: &pci::Device<device::Bou dev, this.mm, &info.usable_fb_regions, - &this.bar_user, + this.bar_user.as_ref().get_ref(), info.bar1_pde_base, this.spec.chipset, ) { diff --git a/drivers/gpu/nova-core/mm/bar_user.rs b/drivers/gpu/nova-core/mm/bar_user.rs index 622a79f1cc22..7f389aea7ca3 100644 --- a/drivers/gpu/nova-core/mm/bar_user.rs +++ b/drivers/gpu/nova-core/mm/bar_user.rs @@ -59,12 +59,12 @@ pub(crate) fn new( } /// Map physical pages to a contiguous BAR1 virtual range. - pub(crate) fn map( - &self, + pub(crate) fn map<'access>( + &'access self, mm: &mut GpuMm<'_>, pfns: &[Pfn], writable: bool, - ) -> Result<BarUserAccess<'_>> { + ) -> Result<BarUserAccess<'access, 'a>> { if pfns.is_empty() { return Err(EINVAL); } @@ -81,14 +81,14 @@ pub(crate) fn map( /// Access object for a mapped BAR1 region. /// /// Borrows the [`BarUser`] managing the mapping for the lifetime of the access object. -pub(crate) struct BarUserAccess<'a> { - bar_user: &'a BarUser<'a>, +pub(crate) struct BarUserAccess<'access, 'gpu> { + bar_user: &'access BarUser<'gpu>, /// Cleared only after PTE invalidation and its TLB flush succeed. mapped: Option<MappedRange>, } #[expect(dead_code)] -impl BarUserAccess<'_> { +impl BarUserAccess<'_, '_> { /// Tear down the BAR1 mapping. pub(crate) fn release(mut self, mm: &mut GpuMm<'_>) -> Result { self.unmap(mm) @@ -168,7 +168,7 @@ pub(crate) fn try_write64(&self, value: u64, offset: usize) -> Result { } } -impl Drop for BarUserAccess<'_> { +impl Drop for BarUserAccess<'_, '_> { fn drop(&mut self) { if self.mapped.is_some() { kernel::pr_warn!( @@ -186,7 +186,7 @@ fn drop(&mut self) { /// address space. Uses the `GpuMm`'s buddy allocator to allocate page tables /// and test pages as needed. #[cfg(CONFIG_NOVA_CORE_SELFTESTS)] -pub(crate) fn run_self_test( +pub(super) fn run_self_test( dev: &device::Device<device::Bound>, mm: &mut GpuMm<'_>, bar_user: &BarUser<'_>, -- 2.53.0
