radv: Avoid deadlock on bo_list.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Sun, 30 Aug 2020 23:57:36 +0000 (01:57 +0200)
committerMarge Bot <eric+marge@anholt.net>
Wed, 2 Sep 2020 18:00:40 +0000 (18:00 +0000)
commit61b714a42ee676fe03b383c0caf050169e404c7d
tree4c08c467ca5625ae37c0424c2ccb8f75284159c2
parent6b75262941b55960e2f73d93f85020fa6c9c2d2f
radv: Avoid deadlock on bo_list.

With the kernel timeline sysncobj changes, the kernel submits do
not necessarily happen in global vkQueueSubmit order. Which should
be fine, we added the appropriate waits for that. (See
DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT in the winsys)

However, all kernel submissions take a lock on the bo_list mutex,
and since we do the wait in the winsys, we wait while having the
bo_list mutex held. This means that as soon as a wait and a signal
submission are out of order we have a deadlock on the bo_list mutex
and the wait.

Solution is to use a shared reader lock during the kernel submission,
as we only need read access for the submission.

Fixes: 6bc5ce7a91d "radv: Add timeline syncobj for timeline semaphores."
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/3446
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6478>
src/amd/vulkan/radv_device.c
src/amd/vulkan/radv_private.h