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@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7205>
This commit is contained in:
Bas Nieuwenhuizen
2020-10-18 02:31:38 +02:00
committed by Marge Bot
parent ba9906fc8f
commit 347a3d68cd
3 changed files with 43 additions and 0 deletions
+4
View File
@@ -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");
+2
View File
@@ -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);
@@ -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;
}