Module: Mesa Branch: main Commit: d2f3e01f6163361afeb89199efd6a84516360da6 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d2f3e01f6163361afeb89199efd6a84516360da6
Author: Samuel Pitoiset <[email protected]> Date: Tue Nov 1 15:28:42 2022 +0100 radv/amdgpu: add a kernel GDS management workaround for -ENOMEM The kernel keeps returning -ENOMEM if multiple processes allocate GDS, this always happen while running VKCTS. This solution is loosely based on RadeonSI, except that it includes a timeout of 1s to exit the loop. Signed-off-by: Samuel Pitoiset <[email protected]> Reviewed-by: Bas Nieuwenhuizen <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19440> --- src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c index 0b49ae221a5..a7f1320d3cc 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c @@ -29,6 +29,7 @@ #include <stdlib.h> #include "drm-uapi/amdgpu_drm.h" +#include "util/os_time.h" #include "util/u_memory.h" #include "ac_debug.h" #include "radv_amdgpu_bo.h" @@ -1858,7 +1859,20 @@ radv_amdgpu_cs_submit(struct radv_amdgpu_ctx *ctx, struct radv_amdgpu_cs_request num_chunks++; } - r = amdgpu_cs_submit_raw2(ctx->ws->dev, ctx->ctx, bo_list, num_chunks, chunks, &request->seq_no); + /* 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. + */ + uint64_t abs_timeout_ns = os_time_get_absolute_timeout(1000000000ull); /* 1s */ + + r = 0; + do { + /* Wait 1 ms and try again. */ + if (r == -ENOMEM) + os_time_sleep(1000); + + r = amdgpu_cs_submit_raw2(ctx->ws->dev, ctx->ctx, bo_list, num_chunks, chunks, &request->seq_no); + } while (r == -ENOMEM && os_time_get_nano() < abs_timeout_ns); if (r) { if (r == -ENOMEM) {
