summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2022-06-06 07:26:34 -0400
committerMarge Bot <emma+marge@anholt.net>2022-06-11 11:14:16 +0000
commit4d4bd7cb5b68e81b9c5637855135a767c5857477 (patch)
treed0e7d08e0c534638620f6557827ee8f4848304ea
parentdfa8dcf80e44b66311513bbb80074da25722c5e3 (diff)
winsys/amdgpu: add a kernel GDS management workaround retrying on -ENOMEM
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16885>
-rw-r--r--src/gallium/winsys/amdgpu/drm/amdgpu_cs.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
index f507847f773..2b03a62ed00 100644
--- a/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
+++ b/src/gallium/winsys/amdgpu/drm/amdgpu_cs.c
@@ -1628,14 +1628,26 @@ static void amdgpu_cs_submit_ib(void *job, void *gdata, int thread_index)
assert(num_chunks <= ARRAY_SIZE(chunks));
- r = noop ? 0 : amdgpu_cs_submit_raw2(ws->dev, acs->ctx->ctx, bo_list,
- num_chunks, chunks, &seq_no);
+ r = 0;
+
+ if (!noop) {
+ /* The kernel returns -ENOMEM with many parallel processes using GDS such as test suites
+ * quite often, but it eventually succeeds after enough attempts. This happens frequently
+ * with dEQP using NGG streamout.
+ */
+ do {
+ /* Wait 1 ms and try again. */
+ if (r == -ENOMEM)
+ os_time_sleep(1000);
+
+ r = amdgpu_cs_submit_raw2(ws->dev, acs->ctx->ctx, bo_list,
+ num_chunks, chunks, &seq_no);
+ } while (r == -ENOMEM);
+ }
}
if (r) {
- if (r == -ENOMEM)
- fprintf(stderr, "amdgpu: Not enough memory for command submission.\n");
- else if (r == -ECANCELED)
+ if (r == -ECANCELED)
fprintf(stderr, "amdgpu: The CS has been cancelled because the context is lost.\n");
else
fprintf(stderr, "amdgpu: The CS has been rejected, "