diff options
author | Marek Olšák <marek.olsak@amd.com> | 2022-04-22 14:16:52 -0400 |
---|---|---|
committer | Marge Bot <emma+marge@anholt.net> | 2022-04-25 13:43:16 +0000 |
commit | 4a982aa5421780a90b812e7654d4d32459d9bdbd (patch) | |
tree | 52e80f60447fe4a89c34e2263f294d76d1cf479f /src/gallium/winsys/amdgpu | |
parent | fe4ec76115fe1c51cfa3659a61747d0397635a9d (diff) |
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@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16112>
Diffstat (limited to 'src/gallium/winsys/amdgpu')
-rw-r--r-- | src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c | 15 |
1 files 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; } |