From 5f5a3691ef2741c012b00b93d7ba93c02aed9cef Mon Sep 17 00:00:00 2001 From: jaap aarts Date: Fri, 26 Dec 2025 21:55:48 +0100 Subject: [PATCH] radv/sqtt: Prevent concurrent submit when sqtt is enabled cc: mesa-stable (cherry picked from commit 8f7941f92da2bbb0bc94c14977a3d54d7574487d) Part-of: --- .pick_status.json | 2 +- src/amd/common/ac_sqtt.c | 4 ++++ src/amd/common/ac_sqtt.h | 3 +++ src/amd/vulkan/layers/radv_sqtt_layer.c | 10 +++++++++- 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 05c077792df..847613ebea4 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1264,7 +1264,7 @@ "description": "radv/sqtt: Prevent concurrent submit when sqtt is enabled", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/amd/common/ac_sqtt.c b/src/amd/common/ac_sqtt.c index 7a13a759fdb..c4562828ff3 100644 --- a/src/amd/common/ac_sqtt.c +++ b/src/amd/common/ac_sqtt.c @@ -49,6 +49,8 @@ ac_sqtt_get_data_va(const struct radeon_info *rad_info, const struct ac_sqtt *da void ac_sqtt_init(struct ac_sqtt *data) { + simple_mtx_init(&data->lock, mtx_plain); + list_inithead(&data->rgp_pso_correlation.record); simple_mtx_init(&data->rgp_pso_correlation.lock, mtx_plain); @@ -71,6 +73,8 @@ ac_sqtt_init(struct ac_sqtt *data) void ac_sqtt_finish(struct ac_sqtt *data) { + simple_mtx_destroy(&data->lock); + assert(data->rgp_pso_correlation.record_count == 0); simple_mtx_destroy(&data->rgp_pso_correlation.lock); diff --git a/src/amd/common/ac_sqtt.h b/src/amd/common/ac_sqtt.h index d69f7c92275..59d0860326e 100644 --- a/src/amd/common/ac_sqtt.h +++ b/src/amd/common/ac_sqtt.h @@ -15,6 +15,7 @@ #include "ac_pm4.h" #include "ac_rgp.h" #include "amd_family.h" +#include "util/simple_mtx.h" #define SQTT_BUFFER_ALIGN_SHIFT 12 @@ -57,6 +58,8 @@ struct ac_sqtt { struct rgp_clock_calibration rgp_clock_calibration; struct hash_table_u64 *pipeline_bos; + + simple_mtx_t lock; }; struct ac_sqtt_data_info { diff --git a/src/amd/vulkan/layers/radv_sqtt_layer.c b/src/amd/vulkan/layers/radv_sqtt_layer.c index 55d70a1f214..7b13f9b9db1 100644 --- a/src/amd/vulkan/layers/radv_sqtt_layer.c +++ b/src/amd/vulkan/layers/radv_sqtt_layer.c @@ -767,8 +767,11 @@ sqtt_QueueSubmit2(VkQueue _queue, uint32_t submitCount, const VkSubmitInfo2 *pSu if (queue->sqtt_present) return radv_sqtt_wsi_submit(_queue, submitCount, pSubmits, _fence); - if (instance->vk.trace_per_submit) + if (instance->vk.trace_per_submit) { + /* Make sure to lock in case of multithreaded submissions. */ + simple_mtx_lock(&device->sqtt.lock); radv_sqtt_start_capturing(queue); + } for (uint32_t i = 0; i < submitCount; i++) { const VkSubmitInfo2 *pSubmit = &pSubmits[i]; @@ -852,12 +855,17 @@ sqtt_QueueSubmit2(VkQueue _queue, uint32_t submitCount, const VkSubmitInfo2 *pSu "radv: Failed to capture RGP for this submit because the buffer is too small and auto-resizing " "is disabled. See RADV_THREAD_TRACE_BUFFER_SIZE for increasing the size.\n"); } + simple_mtx_unlock(&device->sqtt.lock); } return result; fail: FREE(new_cmdbufs); + + if (instance->vk.trace_per_submit) { + simple_mtx_unlock(&device->sqtt.lock); + } return result; }