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@amd.com>
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17256>
This commit is contained in:
Samuel Pitoiset 2022-06-27 17:33:36 +02:00 committed by Marge Bot
parent 3e247cd05f
commit 00cc5ec5cf
3 changed files with 22 additions and 28 deletions

View File

@ -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). */

View File

@ -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,

View File

@ -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);