radeonsi: prevent a deadlock in util_queue_add_job with too many GL contexts
authorMarek Olšák <marek.olsak@amd.com>
Mon, 10 Jul 2017 19:59:43 +0000 (21:59 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Mon, 17 Jul 2017 14:57:25 +0000 (10:57 -0400)
commit4cae27411607d8680401faa2fc971d2be0f715fd
tree7baa1905b8f7c7ed8d177e1d9c121032a17a4e0b
parent59ad7697705a65940f6370c28729aff87d446b46
radeonsi: prevent a deadlock in util_queue_add_job with too many GL contexts

If the queue is full, util_queue_add_job will wait while bo_fence_lock is
held.

It pb_slab wants to reuse a buffer, it will lock the pb_slab mutex and
try to check BO fence busyness, but it has to wait for bo_fence_lock to get
released. Both bo_fence_lock and pb_slab mutex are locked now.

When the CS thread unreferences and releases a suballocated buffer,
it will try to lock the pb_slab mutex and has to wait. The CS thread
can't finish its job in order to free a queue slot and unblock
util_queue_add_job ==> deadlock.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c