From 80177306d97beaafd8c5d45e6f5e633f9d8f035f Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 31 Aug 2017 11:44:00 +0200 Subject: [PATCH] radv: report VM faults if detected It's fairly simple for now, but this might be quite useful. Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen --- src/amd/vulkan/radv_debug.c | 13 +++++++++++++ src/amd/vulkan/radv_private.h | 3 +++ 2 files changed, 16 insertions(+) diff --git a/src/amd/vulkan/radv_debug.c b/src/amd/vulkan/radv_debug.c index 4024f75da88..949eeea2f36 100644 --- a/src/amd/vulkan/radv_debug.c +++ b/src/amd/vulkan/radv_debug.c @@ -28,6 +28,7 @@ #include #include +#include "ac_debug.h" #include "radv_debug.h" bool @@ -44,6 +45,9 @@ radv_init_trace(struct radv_device *device) if (!device->trace_id_ptr) return false; + ac_vm_fault_occured(device->physical_device->rad_info.chip_class, + &device->dmesg_timestamp, NULL); + return true; } @@ -80,9 +84,18 @@ radv_gpu_hang_occured(struct radv_queue *queue) void radv_check_gpu_hangs(struct radv_queue *queue, struct radeon_winsys_cs *cs) { + struct radv_device *device = queue->device; + uint64_t addr; + if (!radv_gpu_hang_occured(queue)) return; + if (ac_vm_fault_occured(device->physical_device->rad_info.chip_class, + &device->dmesg_timestamp, &addr)) { + fprintf(stderr, "VM fault report.\n\n"); + fprintf(stderr, "Failing VM page: 0x%08"PRIx64"\n\n", addr); + } + radv_dump_trace(queue->device, cs); abort(); } diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index 73f7bdbe8a0..28e70e69150 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -555,6 +555,9 @@ struct radv_device { uint32_t fmask_mrt_offset_counter; struct list_head shader_slabs; mtx_t shader_slab_mutex; + + /* For detecting VM faults reported by dmesg. */ + uint64_t dmesg_timestamp; }; struct radv_device_memory { -- 2.30.2