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) {

Reply via email to