From 28a781323fba87e6e338cfecb0b6fe25a08f61a4 Mon Sep 17 00:00:00 2001 From: Ilia Mirkin Date: Sat, 9 Jan 2021 13:13:42 -0500 Subject: [PATCH] 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 Reviewed-by: Karol Herbst Part-of: --- 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 | 11 +---------- src/gallium/drivers/nouveau/nvc0/nvc0_screen.c | 11 +---------- 5 files changed, 19 insertions(+), 31 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, ¤t); - nouveau_fence_wait(current, NULL); - nouveau_fence_ref(NULL, ¤t); - 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_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, ¤t); - nouveau_fence_wait(current, NULL); - nouveau_fence_ref(NULL, ¤t); - nouveau_fence_ref(NULL, &screen->base.fence.current); - } 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, ¤t); - nouveau_fence_wait(current, NULL); - nouveau_fence_ref(NULL, ¤t); - nouveau_fence_ref(NULL, &screen->base.fence.current); - } if (screen->base.pushbuf) screen->base.pushbuf->user_priv = NULL;