diff options
author | Samuel Pitoiset <[email protected]> | 2017-08-31 11:44:00 +0200 |
---|---|---|
committer | Samuel Pitoiset <[email protected]> | 2017-09-01 09:46:36 +0200 |
commit | 80177306d97beaafd8c5d45e6f5e633f9d8f035f (patch) | |
tree | bb1b41c7a976a75ab01ec7820ef55ef51a0e5f9e | |
parent | 12cbd9a13f97f67b62657728bc244b96de7f7b83 (diff) |
radv: report VM faults if detected
It's fairly simple for now, but this might be quite useful.
Signed-off-by: Samuel Pitoiset <[email protected]>
Reviewed-by: Bas Nieuwenhuizen <[email protected]>
-rw-r--r-- | src/amd/vulkan/radv_debug.c | 13 | ||||
-rw-r--r-- | src/amd/vulkan/radv_private.h | 3 |
2 files changed, 16 insertions, 0 deletions
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 <stdlib.h> #include <stdio.h> +#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 { |