From 4d4bd7cb5b68e81b9c5637855135a767c5857477 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Mon, 6 Jun 2022 07:26:34 -0400 Subject: [PATCH] winsys/amdgpu: add a kernel GDS management workaround retrying on -ENOMEM Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/gallium/winsys/amdgpu/drm/amdgpu_cs.c | 22 +++++++++++++++++----- 1 file 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 f507847..2b03a62 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, " -- 2.7.4