radv: add RADV_DEBUG=vm option

Useful for debugging page faults because this adds a gap between every
VA allocation.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/38907>
This commit is contained in:
Samuel Pitoiset 2025-12-11 14:57:08 +01:00 committed by Marge Bot
parent e53576a559
commit 0beb83b0eb
6 changed files with 16 additions and 5 deletions

View file

@ -1504,6 +1504,8 @@ RADV driver environment variables
Use bvh4 encoding on GPUs that support bvh8 encoding.
``validatevas``
Enable tracking of VA ranges for radv_build_is_valid_va.
``vm``
add a gap between all VA allocations to check for page faults
.. envvar:: RADV_FORCE_VRS

View file

@ -73,6 +73,7 @@ enum {
RADV_DEBUG_DUMP_BO_HISTORY = 1ull << 58,
RADV_DEBUG_NO_BO_LIST = 1ull << 59,
RADV_DEBUG_DUMP_IBS = 1ull << 60,
RADV_DEBUG_VM = 1ull << 61,
RADV_DEBUG_DUMP_SHADERS = RADV_DEBUG_DUMP_VS | RADV_DEBUG_DUMP_TCS | RADV_DEBUG_DUMP_TES | RADV_DEBUG_DUMP_GS |
RADV_DEBUG_DUMP_PS | RADV_DEBUG_DUMP_TASK | RADV_DEBUG_DUMP_MESH | RADV_DEBUG_DUMP_CS |
RADV_DEBUG_DUMP_NIR | RADV_DEBUG_DUMP_ASM | RADV_DEBUG_DUMP_BACKEND_IR,

View file

@ -89,6 +89,7 @@ static const struct debug_control radv_debug_options[] = {
{"bo_history", RADV_DEBUG_DUMP_BO_HISTORY},
{"nobolist", RADV_DEBUG_NO_BO_LIST},
{"dumpibs", RADV_DEBUG_DUMP_IBS},
{"vm", RADV_DEBUG_VM},
{NULL, 0},
};

View file

@ -508,8 +508,10 @@ radv_amdgpu_winsys_virtual_bo_create(struct radeon_winsys *_ws, uint64_t size, u
const uint64_t va_flags = AMDGPU_VA_RANGE_HIGH | (flags & RADEON_FLAG_32BIT ? AMDGPU_VA_RANGE_32_BIT : 0) |
(flags & RADEON_FLAG_REPLAYABLE ? AMDGPU_VA_RANGE_REPLAYABLE : 0);
r = ac_drm_va_range_alloc(ws->dev, amdgpu_gpu_va_range_general, size, virt_alignment, replay_address, &va,
&va_handle, va_flags);
const uint64_t va_gap_size = ws->debug_vm ? MAX2(4 * virt_alignment, 64 * 1024) : 0;
r = ac_drm_va_range_alloc(ws->dev, amdgpu_gpu_va_range_general, size + va_gap_size, virt_alignment, replay_address,
&va, &va_handle, va_flags);
if (r) {
result = replay_address ? VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS : VK_ERROR_OUT_OF_DEVICE_MEMORY;
goto error_va_alloc;
@ -593,8 +595,10 @@ radv_amdgpu_winsys_bo_create(struct radeon_winsys *_ws, uint64_t size, unsigned
const uint64_t va_flags = AMDGPU_VA_RANGE_HIGH | (flags & RADEON_FLAG_32BIT ? AMDGPU_VA_RANGE_32_BIT : 0) |
(flags & RADEON_FLAG_REPLAYABLE ? AMDGPU_VA_RANGE_REPLAYABLE : 0);
r = ac_drm_va_range_alloc(ws->dev, amdgpu_gpu_va_range_general, size, virt_alignment, replay_address, &va,
&va_handle, va_flags);
uint64_t va_gap_size = ws->debug_vm ? MAX2(4 * virt_alignment, 64 * 1024) : 0;
r = ac_drm_va_range_alloc(ws->dev, amdgpu_gpu_va_range_general, size + va_gap_size, virt_alignment, replay_address,
&va, &va_handle, va_flags);
if (r) {
result = replay_address ? VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS : VK_ERROR_OUT_OF_DEVICE_MEMORY;
goto error_va_alloc;

View file

@ -242,7 +242,8 @@ radv_amdgpu_winsys_create(int fd, uint64_t debug_flags, uint64_t perftest_flags,
/* Check that options don't differ from the existing winsys. */
if (((debug_flags & RADV_DEBUG_ALL_BOS) && !ws->debug_all_bos) ||
((debug_flags & RADV_DEBUG_HANG) && !ws->debug_log_bos) ||
((debug_flags & RADV_DEBUG_NO_IB_CHAINING) && ws->chain_ib) || (perftest_flags != ws->perftest)) {
((debug_flags & RADV_DEBUG_NO_IB_CHAINING) && ws->chain_ib) ||
((debug_flags & RADV_DEBUG_VM) && !ws->debug_vm) || (perftest_flags != ws->perftest)) {
fprintf(stderr, "radv/amdgpu: Found options that differ from the existing winsys.\n");
return VK_ERROR_INITIALIZATION_FAILED;
}
@ -328,6 +329,7 @@ radv_amdgpu_winsys_create(int fd, uint64_t debug_flags, uint64_t perftest_flags,
ws->perftest = perftest_flags;
ws->zero_all_vram_allocs = debug_flags & RADV_DEBUG_ZERO_VRAM;
ws->debug_vm = debug_flags & RADV_DEBUG_VM;
u_rwlock_init(&ws->global_bo_list.lock);
list_inithead(&ws->log_bo_list);
u_rwlock_init(&ws->log_bo_list_lock);

View file

@ -35,6 +35,7 @@ struct radv_amdgpu_winsys {
FILE *bo_history_logfile;
bool chain_ib;
bool zero_all_vram_allocs;
bool debug_vm;
uint64_t perftest;
alignas(8) uint64_t allocated_vram;