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