diff options
author | Marek Olšák <[email protected]> | 2017-07-10 21:59:43 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2017-07-17 10:57:25 -0400 |
commit | 4cae27411607d8680401faa2fc971d2be0f715fd (patch) | |
tree | 7baa1905b8f7c7ed8d177e1d9c121032a17a4e0b /src/gallium/winsys/amdgpu/drm | |
parent | 59ad7697705a65940f6370c28729aff87d446b46 (diff) |
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 <[email protected]>
Diffstat (limited to 'src/gallium/winsys/amdgpu/drm')
-rw-r--r-- | src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c index 30f4dfb769d..837c1e2aae0 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_winsys.c @@ -316,7 +316,8 @@ amdgpu_winsys_create(int fd, unsigned flags, (void) mtx_init(&ws->global_bo_list_lock, mtx_plain); (void) mtx_init(&ws->bo_fence_lock, mtx_plain); - if (!util_queue_init(&ws->cs_queue, "amdgpu_cs", 8, 1, 0)) { + if (!util_queue_init(&ws->cs_queue, "amdgpu_cs", 8, 1, + UTIL_QUEUE_INIT_RESIZE_IF_FULL)) { amdgpu_winsys_destroy(&ws->base); mtx_unlock(&dev_tab_mutex); return NULL; |