Mesa (master): nouveau: change fence destruction logic on screen destroy

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Jan 11 23:07:37 UTC 2021


Module: Mesa
Branch: master
Commit: 28a781323fba87e6e338cfecb0b6fe25a08f61a4
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=28a781323fba87e6e338cfecb0b6fe25a08f61a4

Author: Ilia Mirkin <imirkin at alum.mit.edu>
Date:   Sat Jan  9 13:13:42 2021 -0500

nouveau: change fence destruction logic on screen destroy

With the drm shim, we can't actually wait for the hardware to do
anything. But why wait for it at all? We just need to make sure to
execute all the work and clean up any resources. Add a helper to do
that.

Signed-off-by: Ilia Mirkin <imirkin at alum.mit.edu>
Reviewed-by: Karol Herbst <kherbst at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8406>

---

 src/gallium/drivers/nouveau/nouveau_fence.c    | 15 +++++++++++++++
 src/gallium/drivers/nouveau/nouveau_fence.h    |  1 +
 src/gallium/drivers/nouveau/nv30/nv30_screen.c | 12 +-----------
 src/gallium/drivers/nouveau/nv50/nv50_screen.c | 13 ++-----------
 src/gallium/drivers/nouveau/nvc0/nvc0_screen.c | 11 +----------
 5 files changed, 20 insertions(+), 32 deletions(-)

diff --git a/src/gallium/drivers/nouveau/nouveau_fence.c b/src/gallium/drivers/nouveau/nouveau_fence.c
index a830f8133d7..f317d0451d4 100644
--- a/src/gallium/drivers/nouveau/nouveau_fence.c
+++ b/src/gallium/drivers/nouveau/nouveau_fence.c
@@ -108,6 +108,21 @@ nouveau_fence_del(struct nouveau_fence *fence)
    FREE(fence);
 }
 
+void
+nouveau_fence_cleanup(struct nouveau_screen *screen)
+{
+   struct nouveau_fence *fence, *next;
+
+   for (fence = screen->fence.head; fence; fence = next) {
+      next = fence->next;
+      nouveau_fence_trigger_work(fence);
+      nouveau_fence_ref(NULL, &fence);
+   }
+   screen->fence.head = NULL;
+   screen->fence.tail = NULL;
+   nouveau_fence_ref(NULL, &screen->fence.current);
+}
+
 void
 nouveau_fence_update(struct nouveau_screen *screen, bool flushed)
 {
diff --git a/src/gallium/drivers/nouveau/nouveau_fence.h b/src/gallium/drivers/nouveau/nouveau_fence.h
index e14572bce8f..72a5496cb19 100644
--- a/src/gallium/drivers/nouveau/nouveau_fence.h
+++ b/src/gallium/drivers/nouveau/nouveau_fence.h
@@ -33,6 +33,7 @@ void nouveau_fence_emit(struct nouveau_fence *);
 void nouveau_fence_del(struct nouveau_fence *);
 
 bool nouveau_fence_new(struct nouveau_screen *, struct nouveau_fence **);
+void nouveau_fence_cleanup(struct nouveau_screen *);
 bool nouveau_fence_work(struct nouveau_fence *, void (*)(void *), void *);
 void nouveau_fence_update(struct nouveau_screen *, bool flushed);
 void nouveau_fence_next(struct nouveau_screen *);
diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
index 5718d9d51c1..8db9fded5cb 100644
--- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c
+++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
@@ -495,17 +495,7 @@ nv30_screen_destroy(struct pipe_screen *pscreen)
    if (!nouveau_drm_screen_unref(&screen->base))
       return;
 
-   if (screen->base.fence.current) {
-      struct nouveau_fence *current = NULL;
-
-      /* nouveau_fence_wait will create a new current fence, so wait on the
-       * _current_ one, and remove both.
-       */
-      nouveau_fence_ref(screen->base.fence.current, &current);
-      nouveau_fence_wait(current, NULL);
-      nouveau_fence_ref(NULL, &current);
-      nouveau_fence_ref(NULL, &screen->base.fence.current);
-   }
+   nouveau_fence_cleanup(&screen->base);
 
    nouveau_bo_ref(NULL, &screen->notify);
 
diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
index 71152a29589..a54cb652b8d 100644
--- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
+++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
@@ -555,17 +555,8 @@ nv50_screen_destroy(struct pipe_screen *pscreen)
    if (!nouveau_drm_screen_unref(&screen->base))
       return;
 
-   if (screen->base.fence.current) {
-      struct nouveau_fence *current = NULL;
-
-      /* nouveau_fence_wait will create a new current fence, so wait on the
-       * _current_ one, and remove both.
-       */
-      nouveau_fence_ref(screen->base.fence.current, &current);
-      nouveau_fence_wait(current, NULL);
-      nouveau_fence_ref(NULL, &current);
-      nouveau_fence_ref(NULL, &screen->base.fence.current);
-   }
+   nouveau_fence_cleanup(&screen->base);
+
    if (screen->base.pushbuf)
       screen->base.pushbuf->user_priv = NULL;
 
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
index c2bff918d8e..bdaa2289a85 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
@@ -673,17 +673,8 @@ nvc0_screen_destroy(struct pipe_screen *pscreen)
    if (!nouveau_drm_screen_unref(&screen->base))
       return;
 
-   if (screen->base.fence.current) {
-      struct nouveau_fence *current = NULL;
+   nouveau_fence_cleanup(&screen->base);
 
-      /* nouveau_fence_wait will create a new current fence, so wait on the
-       * _current_ one, and remove both.
-       */
-      nouveau_fence_ref(screen->base.fence.current, &current);
-      nouveau_fence_wait(current, NULL);
-      nouveau_fence_ref(NULL, &current);
-      nouveau_fence_ref(NULL, &screen->base.fence.current);
-   }
    if (screen->base.pushbuf)
       screen->base.pushbuf->user_priv = NULL;
 



More information about the mesa-commit mailing list