Module: Mesa Branch: main Commit: 860532c5a16e912b66537d911f60b61439630937 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=860532c5a16e912b66537d911f60b61439630937
Author: Bas Nieuwenhuizen <[email protected]> Date: Wed Nov 10 00:53:14 2021 +0100 radv: Add safety check for RGP traces on VanGogh. To avoid accidental hangs. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/5260 Reviewed-by: Samuel Pitoiset <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13730> --- src/amd/common/ac_sqtt.c | 22 ++++++++++++++++++++++ src/amd/common/ac_sqtt.h | 2 ++ src/amd/vulkan/layers/radv_sqtt_layer.c | 8 ++++++++ 3 files changed, 32 insertions(+) diff --git a/src/amd/common/ac_sqtt.c b/src/amd/common/ac_sqtt.c index 672d3de384b..c52b32b3e24 100644 --- a/src/amd/common/ac_sqtt.c +++ b/src/amd/common/ac_sqtt.c @@ -148,3 +148,25 @@ ac_sqtt_add_code_object_loader_event(struct ac_thread_trace_data *thread_trace_d return true; } + +/* See https://gitlab.freedesktop.org/mesa/mesa/-/issues/5260 + * On some HW SQTT can hang if we're not in one of the profiling pstates. */ +bool +ac_check_profile_state(const struct radeon_info *info) +{ + char path[128]; + char data[128]; + int n; + + snprintf(path, sizeof(path), + "/sys/bus/pci/devices/%04x:%02x:%02x.%x/power_dpm_force_performance_level", + info->pci_domain, info->pci_bus, info->pci_dev, info->pci_func); + + FILE *f = fopen(path, "r"); + if (!f) + return false; /* Unknown but optimistic. */ + n = fread(data, 1, sizeof(data) - 1, f); + fclose(f); + data[n] = 0; + return strstr(data, "profile") == NULL; +} diff --git a/src/amd/common/ac_sqtt.h b/src/amd/common/ac_sqtt.h index 20dac839b27..55130aa2221 100644 --- a/src/amd/common/ac_sqtt.h +++ b/src/amd/common/ac_sqtt.h @@ -498,4 +498,6 @@ bool ac_sqtt_add_code_object_loader_event(struct ac_thread_trace_data *thread_tr uint64_t pipeline_hash, uint64_t base_address); +bool ac_check_profile_state(const struct radeon_info *info); + #endif diff --git a/src/amd/vulkan/layers/radv_sqtt_layer.c b/src/amd/vulkan/layers/radv_sqtt_layer.c index 6cfa42ee192..94650a2209d 100644 --- a/src/amd/vulkan/layers/radv_sqtt_layer.c +++ b/src/amd/vulkan/layers/radv_sqtt_layer.c @@ -394,6 +394,14 @@ radv_handle_thread_trace(VkQueue _queue) #endif if (frame_trigger || file_trigger || resize_trigger) { + if (ac_check_profile_state(&queue->device->physical_device->rad_info)) { + fprintf(stderr, "radv: Canceling RGP trace request as a hang condition has been " + "detected. Force the GPU into a profiling mode with e.g. " + "\"echo profile_peak > " + "/sys/class/drm/card0/device/power_dpm_force_performance_level\"\n"); + return; + } + radv_begin_thread_trace(queue); assert(!thread_trace_enabled); thread_trace_enabled = true;
