Danilo Krummrich
2025-Sep-01 15:01 UTC
[PATCH v2] gpu: nova-core: take advantage of pci::Device::unbind()
Now that we have pci::Device::unbind() we can unregister the sysmem
flush page with a direct access the I/O resource, i.e. without RCU read
side critical section.
Signed-off-by: Danilo Krummrich <dakr at kernel.org>
---
Changes in v2:
- Use Device<Core>.
- Add doc-comment.
---
drivers/gpu/nova-core/driver.rs | 4 ++++
drivers/gpu/nova-core/gpu.rs | 22 ++++++++++++----------
2 files changed, 16 insertions(+), 10 deletions(-)
diff --git a/drivers/gpu/nova-core/driver.rs b/drivers/gpu/nova-core/driver.rs
index 274989ea1fb4..02b3edd7bbdc 100644
--- a/drivers/gpu/nova-core/driver.rs
+++ b/drivers/gpu/nova-core/driver.rs
@@ -54,4 +54,8 @@ fn probe(pdev: &pci::Device<Core>, _info:
&Self::IdInfo) -> Result<Pin<KBox<Self
Ok(this)
}
+
+ fn unbind(pdev: &pci::Device<Core>, this: Pin<&Self>) {
+ this.gpu.unbind(pdev.as_ref());
+ }
}
diff --git a/drivers/gpu/nova-core/gpu.rs b/drivers/gpu/nova-core/gpu.rs
index 8caecaf7dfb4..80a54e303663 100644
--- a/drivers/gpu/nova-core/gpu.rs
+++ b/drivers/gpu/nova-core/gpu.rs
@@ -163,7 +163,7 @@ fn new(bar: &Bar0) -> Result<Spec> {
}
/// Structure holding the resources required to operate the GPU.
-#[pin_data(PinnedDrop)]
+#[pin_data]
pub(crate) struct Gpu {
spec: Spec,
/// MMIO mapping of PCI BAR 0
@@ -174,15 +174,6 @@ pub(crate) struct Gpu {
sysmem_flush: SysmemFlush,
}
-#[pinned_drop]
-impl PinnedDrop for Gpu {
- fn drop(self: Pin<&mut Self>) {
- // Unregister the sysmem flush page before we release it.
- self.bar
- .try_access_with(|b| self.sysmem_flush.unregister(b));
- }
-}
-
impl Gpu {
/// Helper function to load and run the FWSEC-FRTS firmware and confirm
that it has properly
/// created the WPR2 region.
@@ -309,4 +300,15 @@ pub(crate) fn new(
sysmem_flush,
}))
}
+
+ /// Called when the corresponding [`Device`](device::Device) is unbound.
+ ///
+ /// Note: This method must only be called from `Driver::unbind`.
+ pub(crate) fn unbind(&self, dev:
&device::Device<device::Core>) {
+ kernel::warn_on!(self
+ .bar
+ .access(dev)
+ .inspect(|bar| self.sysmem_flush.unregister(bar))
+ .is_err());
+ }
}
base-commit: 09f90256e8902793f594517ef440698585eb3595
--
2.51.0
Alexandre Courbot
2025-Sep-02 12:19 UTC
[PATCH v2] gpu: nova-core: take advantage of pci::Device::unbind()
On Tue Sep 2, 2025 at 12:01 AM JST, Danilo Krummrich wrote:> Now that we have pci::Device::unbind() we can unregister the sysmem > flush page with a direct access the I/O resource, i.e. without RCU read > side critical section. > > Signed-off-by: Danilo Krummrich <dakr at kernel.org>Reviewed-by: Alexandre Courbot <acourbot at nvidia.com>
Alexandre Courbot
2025-Sep-06 11:20 UTC
[PATCH v2] gpu: nova-core: take advantage of pci::Device::unbind()
On Tue Sep 2, 2025 at 12:01 AM JST, Danilo Krummrich wrote:> Now that we have pci::Device::unbind() we can unregister the sysmem > flush page with a direct access the I/O resource, i.e. without RCU read > side critical section. > > Signed-off-by: Danilo Krummrich <dakr at kernel.org>Pushed to drm-rust-next, thanks!