Mesa (main): winsys/amdgpu: fix a mutex deadlock when we fail to create pipe_screen

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Apr 25 14:05:16 UTC 2022


Module: Mesa
Branch: main
Commit: 4a982aa5421780a90b812e7654d4d32459d9bdbd
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=4a982aa5421780a90b812e7654d4d32459d9bdbd

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Fri Apr 22 14:16:52 2022 -0400

winsys/amdgpu: fix a mutex deadlock when we fail to create pipe_screen

Fixes: 2eb067db0fe - winsys/amdgpu: add a new winsys for the new kernel driver

Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16112>

---

 src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c
index 5101b55f677..edcf2c82a04 100644
--- a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c
+++ b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c
@@ -154,7 +154,7 @@ static void do_winsys_deinit(struct amdgpu_winsys *ws)
    FREE(ws);
 }
 
-static void amdgpu_winsys_destroy(struct radeon_winsys *rws)
+static void amdgpu_winsys_destroy_locked(struct radeon_winsys *rws, bool locked)
 {
    struct amdgpu_screen_winsys *sws = amdgpu_screen_winsys(rws);
    struct amdgpu_winsys *ws = sws->aws;
@@ -166,7 +166,8 @@ static void amdgpu_winsys_destroy(struct radeon_winsys *rws)
     * amdgpu_winsys_create in another thread doesn't get the winsys
     * from the table when the counter drops to 0.
     */
-   simple_mtx_lock(&dev_tab_mutex);
+   if (!locked)
+      simple_mtx_lock(&dev_tab_mutex);
 
    destroy = pipe_reference(&ws->reference, NULL);
    if (destroy && dev_tab) {
@@ -177,7 +178,8 @@ static void amdgpu_winsys_destroy(struct radeon_winsys *rws)
       }
    }
 
-   simple_mtx_unlock(&dev_tab_mutex);
+   if (!locked)
+      simple_mtx_unlock(&dev_tab_mutex);
 
    if (destroy)
       do_winsys_deinit(ws);
@@ -186,6 +188,11 @@ static void amdgpu_winsys_destroy(struct radeon_winsys *rws)
    FREE(rws);
 }
 
+static void amdgpu_winsys_destroy(struct radeon_winsys *rws)
+{
+   amdgpu_winsys_destroy_locked(rws, false);
+}
+
 static void amdgpu_winsys_query_info(struct radeon_winsys *rws,
                                      struct radeon_info *info,
                                      bool enable_smart_access_memory,
@@ -555,7 +562,7 @@ amdgpu_winsys_create(int fd, const struct pipe_screen_config *config,
     * and link all drivers into one binary blob. */
    ws->base.screen = screen_create(&ws->base, config);
    if (!ws->base.screen) {
-      amdgpu_winsys_destroy(&ws->base);
+      amdgpu_winsys_destroy_locked(&ws->base, true);
       simple_mtx_unlock(&dev_tab_mutex);
       return NULL;
    }



More information about the mesa-commit mailing list