From: Marek Olšák <marek.ol...@amd.com> If GDS/GWS/OA resources are being used by IBs that are currently busy, the kernel driver returns -ENOMEM instead of waiting until those resources are idle. --- src/gallium/winsys/amdgpu/drm/amdgpu_cs.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c index 1438b1ffe76..edb90c1a734 100644 --- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c +++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c @@ -1596,8 +1596,13 @@ void amdgpu_cs_submit_ib(void *job, int thread_index) chunks[num_chunks].chunk_data = (uintptr_t)&cs->ib[IB_PARALLEL_COMPUTE]; num_chunks++; - r = amdgpu_cs_submit_raw2(ws->dev, acs->ctx->ctx, bo_list, - num_chunks, chunks, NULL); + /* The memory manager can return -ENOMEM for GDS when all GDS resources + * are busy. The workaround is to wait until they are idle. + */ + while ((r = amdgpu_cs_submit_raw2(ws->dev, acs->ctx->ctx, bo_list, + num_chunks, chunks, NULL)) == -ENOMEM) + usleep(2000); + if (r) goto finalize; @@ -1643,8 +1648,12 @@ void amdgpu_cs_submit_ib(void *job, int thread_index) assert(num_chunks <= ARRAY_SIZE(chunks)); - r = amdgpu_cs_submit_raw2(ws->dev, acs->ctx->ctx, bo_list, - num_chunks, chunks, &seq_no); + /* The memory manager can return -ENOMEM for GDS when all GDS resources + * are busy. The workaround is to wait until they are idle. + */ + while ((r = amdgpu_cs_submit_raw2(ws->dev, acs->ctx->ctx, bo_list, + num_chunks, chunks, &seq_no)) == -ENOMEM) + usleep(2000); } finalize: -- 2.17.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev