diff options
author | Ilia Mirkin <imirkin@alum.mit.edu> | 2021-02-04 12:15:43 -0500 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2021-02-06 23:04:35 +0000 |
commit | 92f12952f32ee08cd302f8591ab059ca5f167239 (patch) | |
tree | a6c1ca90bf1a77b6d00100103fcbe7f02cf070c0 /src/gallium/drivers/nouveau | |
parent | 0464117ad9bd47f079175058771220e8dad4f00b (diff) |
nouveau: reinstate fencing on screen destroy
As it turns out, the wait is required as the driver expects for
rendering to be quiesced on exit. This can trigger channel failures,
which in turn trigger recovery. This can fail and destroy the whole
system.
Fixes: 28a781323fb ("nouveau: change fence destruction logic on screen destroy")
References: https://gitlab.freedesktop.org/mesa/mesa/-/issues/4223
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Karol Herbst <kherbst@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8867>
Diffstat (limited to 'src/gallium/drivers/nouveau')
-rw-r--r-- | src/gallium/drivers/nouveau/nouveau_fence.c | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/src/gallium/drivers/nouveau/nouveau_fence.c b/src/gallium/drivers/nouveau/nouveau_fence.c index 49f686bfbb5..b4c938fff61 100644 --- a/src/gallium/drivers/nouveau/nouveau_fence.c +++ b/src/gallium/drivers/nouveau/nouveau_fence.c @@ -111,17 +111,15 @@ nouveau_fence_del(struct nouveau_fence *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; if (screen->fence.current) { - nouveau_fence_trigger_work(screen->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->fence.current, ¤t); + nouveau_fence_wait(current, NULL); + nouveau_fence_ref(NULL, ¤t); nouveau_fence_ref(NULL, &screen->fence.current); } } |