Mesa (main): radv: do not emit SQTT user data packets on the SDMA queue

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jun 29 07:03:32 UTC 2022


Module: Mesa
Branch: main
Commit: 00cc5ec5cf775425dbb0a7c8c3e6ea8cb54e0a5f
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=00cc5ec5cf775425dbb0a7c8c3e6ea8cb54e0a5f

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Mon Jun 27 17:33:36 2022 +0200

radv: do not emit SQTT user data packets on the SDMA queue

They aren't supported and lead to GPU hangs.

Reported-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
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/17256>

---

 src/amd/vulkan/layers/radv_sqtt_layer.c | 36 +++++++++++----------------------
 src/amd/vulkan/radv_private.h           |  4 ++--
 src/amd/vulkan/radv_sqtt.c              | 10 +++++++--
 3 files changed, 22 insertions(+), 28 deletions(-)

diff --git a/src/amd/vulkan/layers/radv_sqtt_layer.c b/src/amd/vulkan/layers/radv_sqtt_layer.c
index e56991cb264..917d27ccdfc 100644
--- a/src/amd/vulkan/layers/radv_sqtt_layer.c
+++ b/src/amd/vulkan/layers/radv_sqtt_layer.c
@@ -33,12 +33,11 @@ radv_write_begin_general_api_marker(struct radv_cmd_buffer *cmd_buffer,
                                     enum rgp_sqtt_marker_general_api_type api_type)
 {
    struct rgp_sqtt_marker_general_api marker = {0};
-   struct radeon_cmdbuf *cs = cmd_buffer->cs;
 
    marker.identifier = RGP_SQTT_MARKER_IDENTIFIER_GENERAL_API;
    marker.api_type = api_type;
 
-   radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4);
+   radv_emit_thread_trace_userdata(cmd_buffer, &marker, sizeof(marker) / 4);
 }
 
 static void
@@ -46,13 +45,12 @@ radv_write_end_general_api_marker(struct radv_cmd_buffer *cmd_buffer,
                                   enum rgp_sqtt_marker_general_api_type api_type)
 {
    struct rgp_sqtt_marker_general_api marker = {0};
-   struct radeon_cmdbuf *cs = cmd_buffer->cs;
 
    marker.identifier = RGP_SQTT_MARKER_IDENTIFIER_GENERAL_API;
    marker.api_type = api_type;
    marker.is_end = 1;
 
-   radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4);
+   radv_emit_thread_trace_userdata(cmd_buffer, &marker, sizeof(marker) / 4);
 }
 
 static void
@@ -61,7 +59,6 @@ radv_write_event_marker(struct radv_cmd_buffer *cmd_buffer,
                         uint32_t instance_offset_user_data, uint32_t draw_index_user_data)
 {
    struct rgp_sqtt_marker_event marker = {0};
-   struct radeon_cmdbuf *cs = cmd_buffer->cs;
 
    marker.identifier = RGP_SQTT_MARKER_IDENTIFIER_EVENT;
    marker.api_type = api_type;
@@ -80,7 +77,7 @@ radv_write_event_marker(struct radv_cmd_buffer *cmd_buffer,
    marker.instance_offset_reg_idx = instance_offset_user_data;
    marker.draw_index_reg_idx = draw_index_user_data;
 
-   radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4);
+   radv_emit_thread_trace_userdata(cmd_buffer, &marker, sizeof(marker) / 4);
 }
 
 static void
@@ -89,7 +86,6 @@ radv_write_event_with_dims_marker(struct radv_cmd_buffer *cmd_buffer,
                                   uint32_t z)
 {
    struct rgp_sqtt_marker_event_with_dims marker = {0};
-   struct radeon_cmdbuf *cs = cmd_buffer->cs;
 
    marker.event.identifier = RGP_SQTT_MARKER_IDENTIFIER_EVENT;
    marker.event.api_type = api_type;
@@ -101,22 +97,20 @@ radv_write_event_with_dims_marker(struct radv_cmd_buffer *cmd_buffer,
    marker.thread_y = y;
    marker.thread_z = z;
 
-   radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4);
+   radv_emit_thread_trace_userdata(cmd_buffer, &marker, sizeof(marker) / 4);
 }
 
 static void
 radv_write_user_event_marker(struct radv_cmd_buffer *cmd_buffer,
                              enum rgp_sqtt_marker_user_event_type type, const char *str)
 {
-   struct radeon_cmdbuf *cs = cmd_buffer->cs;
-
    if (type == UserEventPop) {
       assert(str == NULL);
       struct rgp_sqtt_marker_user_event marker = {0};
       marker.identifier = RGP_SQTT_MARKER_IDENTIFIER_USER_EVENT;
       marker.data_type = type;
 
-      radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4);
+      radv_emit_thread_trace_userdata(cmd_buffer, &marker, sizeof(marker) / 4);
    } else {
       assert(str != NULL);
       unsigned len = strlen(str);
@@ -130,7 +124,7 @@ radv_write_user_event_marker(struct radv_cmd_buffer *cmd_buffer,
       memcpy(buffer, &marker, sizeof(marker));
       memcpy(buffer + sizeof(marker), str, len);
 
-      radv_emit_thread_trace_userdata(cmd_buffer->device, cs, buffer,
+      radv_emit_thread_trace_userdata(cmd_buffer, buffer,
                                       sizeof(marker) / 4 + marker.length / 4);
    }
 }
@@ -140,7 +134,6 @@ radv_describe_begin_cmd_buffer(struct radv_cmd_buffer *cmd_buffer)
 {
    uint64_t device_id = (uintptr_t)cmd_buffer->device;
    struct rgp_sqtt_marker_cb_start marker = {0};
-   struct radeon_cmdbuf *cs = cmd_buffer->cs;
 
    if (likely(!cmd_buffer->device->thread_trace.bo))
       return;
@@ -155,7 +148,7 @@ radv_describe_begin_cmd_buffer(struct radv_cmd_buffer *cmd_buffer)
    if (cmd_buffer->qf == RADV_QUEUE_GENERAL)
       marker.queue_flags |= VK_QUEUE_GRAPHICS_BIT;
 
-   radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4);
+   radv_emit_thread_trace_userdata(cmd_buffer, &marker, sizeof(marker) / 4);
 }
 
 void
@@ -163,7 +156,6 @@ radv_describe_end_cmd_buffer(struct radv_cmd_buffer *cmd_buffer)
 {
    uint64_t device_id = (uintptr_t)cmd_buffer->device;
    struct rgp_sqtt_marker_cb_end marker = {0};
-   struct radeon_cmdbuf *cs = cmd_buffer->cs;
 
    if (likely(!cmd_buffer->device->thread_trace.bo))
       return;
@@ -173,7 +165,7 @@ radv_describe_end_cmd_buffer(struct radv_cmd_buffer *cmd_buffer)
    marker.device_id_low = device_id;
    marker.device_id_high = device_id >> 32;
 
-   radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4);
+   radv_emit_thread_trace_userdata(cmd_buffer, &marker, sizeof(marker) / 4);
 }
 
 void
@@ -226,7 +218,6 @@ void
 radv_describe_barrier_end_delayed(struct radv_cmd_buffer *cmd_buffer)
 {
    struct rgp_sqtt_marker_barrier_end marker = {0};
-   struct radeon_cmdbuf *cs = cmd_buffer->cs;
 
    if (likely(!cmd_buffer->device->thread_trace.bo) || !cmd_buffer->state.pending_sqtt_barrier_end)
       return;
@@ -271,7 +262,7 @@ radv_describe_barrier_end_delayed(struct radv_cmd_buffer *cmd_buffer)
    if (cmd_buffer->state.sqtt_flush_bits & RGP_FLUSH_INVAL_L1)
       marker.inval_gl1 = true;
 
-   radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4);
+   radv_emit_thread_trace_userdata(cmd_buffer, &marker, sizeof(marker) / 4);
 
    cmd_buffer->state.num_layout_transitions = 0;
 }
@@ -280,7 +271,6 @@ void
 radv_describe_barrier_start(struct radv_cmd_buffer *cmd_buffer, enum rgp_barrier_reason reason)
 {
    struct rgp_sqtt_marker_barrier_start marker = {0};
-   struct radeon_cmdbuf *cs = cmd_buffer->cs;
 
    if (likely(!cmd_buffer->device->thread_trace.bo))
       return;
@@ -292,7 +282,7 @@ radv_describe_barrier_start(struct radv_cmd_buffer *cmd_buffer, enum rgp_barrier
    marker.cb_id = 0;
    marker.dword02 = reason;
 
-   radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4);
+   radv_emit_thread_trace_userdata(cmd_buffer, &marker, sizeof(marker) / 4);
 }
 
 void
@@ -306,7 +296,6 @@ radv_describe_layout_transition(struct radv_cmd_buffer *cmd_buffer,
                                 const struct radv_barrier_data *barrier)
 {
    struct rgp_sqtt_marker_layout_transition marker = {0};
-   struct radeon_cmdbuf *cs = cmd_buffer->cs;
 
    if (likely(!cmd_buffer->device->thread_trace.bo))
       return;
@@ -321,7 +310,7 @@ radv_describe_layout_transition(struct radv_cmd_buffer *cmd_buffer,
    marker.fmask_color_expand = barrier->layout_transitions.fmask_color_expand;
    marker.init_mask_ram = barrier->layout_transitions.init_mask_ram;
 
-   radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4);
+   radv_emit_thread_trace_userdata(cmd_buffer, &marker, sizeof(marker) / 4);
 
    cmd_buffer->state.num_layout_transitions++;
 }
@@ -331,7 +320,6 @@ radv_describe_pipeline_bind(struct radv_cmd_buffer *cmd_buffer,
                             VkPipelineBindPoint pipelineBindPoint, struct radv_pipeline *pipeline)
 {
    struct rgp_sqtt_marker_pipeline_bind marker = {0};
-   struct radeon_cmdbuf *cs = cmd_buffer->cs;
 
    if (likely(!cmd_buffer->device->thread_trace.bo))
       return;
@@ -342,7 +330,7 @@ radv_describe_pipeline_bind(struct radv_cmd_buffer *cmd_buffer,
    marker.api_pso_hash[0] = pipeline->pipeline_hash;
    marker.api_pso_hash[1] = pipeline->pipeline_hash >> 32;
 
-   radv_emit_thread_trace_userdata(cmd_buffer->device, cs, &marker, sizeof(marker) / 4);
+   radv_emit_thread_trace_userdata(cmd_buffer, &marker, sizeof(marker) / 4);
 }
 
 /* TODO: Improve the way to trigger capture (overlay, etc). */
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 42ba7ba0eaa..88466f1a8ee 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -2841,8 +2841,8 @@ void radv_thread_trace_finish(struct radv_device *device);
 bool radv_begin_thread_trace(struct radv_queue *queue);
 bool radv_end_thread_trace(struct radv_queue *queue);
 bool radv_get_thread_trace(struct radv_queue *queue, struct ac_thread_trace *thread_trace);
-void radv_emit_thread_trace_userdata(const struct radv_device *device, struct radeon_cmdbuf *cs,
-                                     const void *data, uint32_t num_dwords);
+void radv_emit_thread_trace_userdata(struct radv_cmd_buffer *cmd_buffer, const void *data,
+                                     uint32_t num_dwords);
 bool radv_is_instruction_timing_enabled(void);
 
 bool radv_sdma_copy_image(struct radv_cmd_buffer *cmd_buffer, struct radv_image *image,
diff --git a/src/amd/vulkan/radv_sqtt.c b/src/amd/vulkan/radv_sqtt.c
index 3e98a489e99..ecd5b36af67 100644
--- a/src/amd/vulkan/radv_sqtt.c
+++ b/src/amd/vulkan/radv_sqtt.c
@@ -335,11 +335,17 @@ radv_emit_thread_trace_stop(struct radv_device *device, struct radeon_cmdbuf *cs
 }
 
 void
-radv_emit_thread_trace_userdata(const struct radv_device *device, struct radeon_cmdbuf *cs,
-                                const void *data, uint32_t num_dwords)
+radv_emit_thread_trace_userdata(struct radv_cmd_buffer *cmd_buffer, const void *data,
+                                uint32_t num_dwords)
 {
+   struct radv_device *device = cmd_buffer->device;
+   struct radeon_cmdbuf *cs = cmd_buffer->cs;
    const uint32_t *dwords = (uint32_t *)data;
 
+   /* SQTT user data packets aren't supported on SDMA queues. */
+   if (cmd_buffer->qf == RADV_QUEUE_TRANSFER)
+      return;
+
    while (num_dwords > 0) {
       uint32_t count = MIN2(num_dwords, 2);
 



More information about the mesa-commit mailing list