Mesa (main): radv: Add safety check for RGP traces on VanGogh.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Dec 17 22:13:38 UTC 2021


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

Author: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
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 <samuel.pitoiset at gmail.com>
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;



More information about the mesa-commit mailing list