Mesa (staging/21.3): radv/sqtt: fix GPU hangs when capturing from the compute queue

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Nov 10 11:16:40 UTC 2021


Module: Mesa
Branch: staging/21.3
Commit: 288d3d45ecd81c8e57fe4c23feab380c9ddcf47d
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=288d3d45ecd81c8e57fe4c23feab380c9ddcf47d

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Fri Nov  5 20:18:42 2021 +0100

radv/sqtt: fix GPU hangs when capturing from the compute queue

S_008D20_FINISH_DONE is a mask of queues and 1 means "wait on the gfx
queue until the value is not 0" which can never happen when the driver
captures from compute. Instead, use the full mask of possible queues.

Cc: 21.3 mesa-stable
Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13694>
(cherry picked from commit 379fab74d2135abb9ada7edec83da983ba0c4257)

---

 .pick_status.json                       | 2 +-
 src/amd/vulkan/layers/radv_sqtt_layer.c | 9 ---------
 src/amd/vulkan/radv_sqtt.c              | 6 +++---
 3 files changed, 4 insertions(+), 13 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index a68490d7133..f5772cad539 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -13,7 +13,7 @@
         "description": "radv/sqtt: fix GPU hangs when capturing from the compute queue",
         "nominated": true,
         "nomination_type": 0,
-        "resolution": 0,
+        "resolution": 1,
         "main_sha": null,
         "because_sha": null
     },
diff --git a/src/amd/vulkan/layers/radv_sqtt_layer.c b/src/amd/vulkan/layers/radv_sqtt_layer.c
index 6a4acda4d17..fb0858bfdae 100644
--- a/src/amd/vulkan/layers/radv_sqtt_layer.c
+++ b/src/amd/vulkan/layers/radv_sqtt_layer.c
@@ -389,15 +389,6 @@ radv_handle_thread_trace(VkQueue _queue)
 #endif
 
       if (frame_trigger || file_trigger || resize_trigger) {
-         /* FIXME: SQTT on compute hangs. */
-         if (queue->vk.queue_family_index == RADV_QUEUE_COMPUTE) {
-            fprintf(stderr, "RADV: Capturing a SQTT trace on the compute "
-                            "queue is currently broken and might hang! "
-                            "Please, disable presenting on compute if "
-                            "you can.\n");
-            return;
-         }
-
          radv_begin_thread_trace(queue);
          assert(!thread_trace_enabled);
          thread_trace_enabled = true;
diff --git a/src/amd/vulkan/radv_sqtt.c b/src/amd/vulkan/radv_sqtt.c
index 71c489910a3..c09cd367e7c 100644
--- a/src/amd/vulkan/radv_sqtt.c
+++ b/src/amd/vulkan/radv_sqtt.c
@@ -271,7 +271,7 @@ radv_emit_thread_trace_stop(struct radv_device *device, struct radeon_cmdbuf *cs
          radeon_emit(cs, R_008D20_SQ_THREAD_TRACE_STATUS >> 2); /* register */
          radeon_emit(cs, 0);
          radeon_emit(cs, 0);                       /* reference value */
-         radeon_emit(cs, S_008D20_FINISH_DONE(1)); /* mask */
+         radeon_emit(cs, ~C_008D20_FINISH_DONE);
          radeon_emit(cs, 4);                       /* poll interval */
 
          /* Disable the thread trace mode. */
@@ -285,7 +285,7 @@ radv_emit_thread_trace_stop(struct radv_device *device, struct radeon_cmdbuf *cs
          radeon_emit(cs, R_008D20_SQ_THREAD_TRACE_STATUS >> 2); /* register */
          radeon_emit(cs, 0);
          radeon_emit(cs, 0);                /* reference value */
-         radeon_emit(cs, S_008D20_BUSY(1)); /* mask */
+         radeon_emit(cs, ~C_008D20_BUSY); /* mask */
          radeon_emit(cs, 4);                /* poll interval */
       } else {
          /* Disable the thread trace mode. */
@@ -298,7 +298,7 @@ radv_emit_thread_trace_stop(struct radv_device *device, struct radeon_cmdbuf *cs
          radeon_emit(cs, R_030CE8_SQ_THREAD_TRACE_STATUS >> 2); /* register */
          radeon_emit(cs, 0);
          radeon_emit(cs, 0);                /* reference value */
-         radeon_emit(cs, S_030CE8_BUSY(1)); /* mask */
+         radeon_emit(cs, ~C_030CE8_BUSY); /* mask */
          radeon_emit(cs, 4);                /* poll interval */
       }
 



More information about the mesa-commit mailing list