Mesa (master): radv: Dump BO VA ranges on hang.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Sat Nov 21 14:34:46 UTC 2020
Module: Mesa
Branch: master
Commit: 347a3d68cd8ed31fb50a7509f1526a2930d0cd50
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=347a3d68cd8ed31fb50a7509f1526a2930d0cd50
Author: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Date: Sun Oct 18 02:31:38 2020 +0200
radv: Dump BO VA ranges on hang.
To make it easier to figure out if a given VA is valid or not.
Gitlab: https://gitlab.freedesktop.org/mesa/mesa/-/issues/3620
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7205>
---
src/amd/vulkan/radv_debug.c | 4 +++
src/amd/vulkan/radv_radeon_winsys.h | 2 ++
src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c | 37 +++++++++++++++++++++++++++
3 files changed, 43 insertions(+)
diff --git a/src/amd/vulkan/radv_debug.c b/src/amd/vulkan/radv_debug.c
index 016104a613b..74bfe993537 100644
--- a/src/amd/vulkan/radv_debug.c
+++ b/src/amd/vulkan/radv_debug.c
@@ -667,6 +667,10 @@ radv_check_gpu_hangs(struct radv_queue *queue, struct radeon_cmdbuf *cs)
fclose(f);
}
+ fprintf(stderr, "BOs:\n");
+ device->ws->dump_bo_ranges(device->ws, stderr);
+ fprintf(stderr, "\n");
+
/* Dump VM fault info. */
if (vm_fault_occurred) {
snprintf(dump_path, sizeof(dump_path), "%s/%s", dump_dir, "vm_fault.log");
diff --git a/src/amd/vulkan/radv_radeon_winsys.h b/src/amd/vulkan/radv_radeon_winsys.h
index da410e5ef63..8cf1b38f242 100644
--- a/src/amd/vulkan/radv_radeon_winsys.h
+++ b/src/amd/vulkan/radv_radeon_winsys.h
@@ -299,6 +299,8 @@ struct radeon_winsys {
void (*cs_dump)(struct radeon_cmdbuf *cs, FILE* file, const int *trace_ids, int trace_id_count);
+ void (*dump_bo_ranges)(struct radeon_winsys *ws, FILE *file);
+
int (*surface_init)(struct radeon_winsys *ws,
const struct ac_surf_info *surf_info,
struct radeon_surf *surf);
diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c
index ee274552355..d775f5bcaa5 100644
--- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c
+++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c
@@ -855,6 +855,42 @@ radv_amdgpu_winsys_bo_get_metadata(struct radeon_winsys_bo *_bo,
memcpy(md->metadata, info.metadata.umd_metadata, sizeof(md->metadata));
}
+static int radv_amdgpu_bo_va_compare(const void *a, const void *b)
+{
+ const struct radv_amdgpu_winsys_bo *bo_a = *(const struct radv_amdgpu_winsys_bo * const*)a;
+ const struct radv_amdgpu_winsys_bo *bo_b = *(const struct radv_amdgpu_winsys_bo * const*)b;
+ return bo_a->base.va < bo_b->base.va ? -1 : bo_a->base.va > bo_b->base.va ? 1 : 0;
+}
+
+static void radv_amdgpu_dump_bo_ranges(struct radeon_winsys *_ws, FILE *file)
+{
+ struct radv_amdgpu_winsys *ws = radv_amdgpu_winsys(_ws);
+ if (ws->debug_all_bos) {
+ struct radv_amdgpu_winsys_bo *bo;
+ struct radv_amdgpu_winsys_bo **bos = NULL;
+ int i = 0;
+
+ u_rwlock_rdlock(&ws->global_bo_list_lock);
+ bos = malloc(sizeof(*bos) * ws->num_buffers);
+ if (!bos) {
+ u_rwlock_rdunlock(&ws->global_bo_list_lock);
+ fprintf(file, " Failed to allocate memory to sort VA ranges for dumping\n");
+ return;
+ }
+ LIST_FOR_EACH_ENTRY(bo, &ws->global_bo_list, global_list_item) {
+ bos[i++] = bo;
+ }
+ qsort(bos, ws->num_buffers, sizeof(bos[0]), radv_amdgpu_bo_va_compare);
+ for (i = 0; i < ws->num_buffers; ++i) {
+ fprintf(file, " VA=%.16llx-%.16llx, handle=%d%s\n",
+ (long long)bos[i]->base.va, (long long)(bos[i]->base.va + bos[i]->size),
+ bos[i]->bo_handle, bos[i]->is_virtual ? " sparse" : "");
+ }
+ free(bos);
+ u_rwlock_rdunlock(&ws->global_bo_list_lock);
+ } else
+ fprintf(file, " To get BO VA ranges, please specify RADV_DEBUG=allbos\n");
+}
void radv_amdgpu_bo_init_functions(struct radv_amdgpu_winsys *ws)
{
ws->base.buffer_create = radv_amdgpu_winsys_bo_create;
@@ -868,4 +904,5 @@ void radv_amdgpu_bo_init_functions(struct radv_amdgpu_winsys *ws)
ws->base.buffer_get_metadata = radv_amdgpu_winsys_bo_get_metadata;
ws->base.buffer_virtual_bind = radv_amdgpu_winsys_bo_virtual_bind;
ws->base.buffer_get_flags_from_fd = radv_amdgpu_bo_get_flags_from_fd;
+ ws->base.dump_bo_ranges = radv_amdgpu_dump_bo_ranges;
}
More information about the mesa-commit
mailing list