intel_hang_replay: Don't force scratch page on Xe KMD unless explicitly requested

Added a --scratch flag instead of always forcing the scratch page enabled, this
allows the hang replay tool to be used to debug page faults.

Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/40149>
This commit is contained in:
Calder Young 2026-03-23 13:31:38 -07:00 committed by Marge Bot
parent 04bfdb287b
commit ebe835e94c
3 changed files with 16 additions and 13 deletions

View file

@ -405,7 +405,7 @@ replay_dmp_file(int file_fd, int drm_fd, const struct intel_device_info *devinfo
struct util_dynarray *buffers, void *mem_ctx,
struct intel_hang_dump_block_exec *init,
struct intel_hang_dump_block_exec *exec,
uint32_t vm_flags, uint32_t bo_dumpable)
uint32_t vm_flags, uint32_t bo_dumpable, bool scratch)
{
/* Sort buffers by size */
qsort(util_dynarray_begin(buffers),
@ -417,7 +417,7 @@ replay_dmp_file(int file_fd, int drm_fd, const struct intel_device_info *devinfo
return process_i915_dmp_file(file_fd, drm_fd, buffers, mem_ctx, init, exec);
else if (devinfo->kmd_type == INTEL_KMD_TYPE_XE)
return process_xe_dmp_file(file_fd, drm_fd, devinfo, buffers, mem_ctx, init, exec,
vm_flags, bo_dumpable);
vm_flags, bo_dumpable, scratch);
else
fprintf(stderr, "driver is unknown, exiting\n");
@ -427,7 +427,7 @@ replay_dmp_file(int file_fd, int drm_fd, const struct intel_device_info *devinfo
int
main(int argc, char *argv[])
{
bool help = false, list = false, bo_dumpable = false;
bool help = false, list = false, bo_dumpable = false, scratch = false;
const struct option aubinator_opts[] = {
{ "address", required_argument, NULL, 'a' },
{ "dump", required_argument, NULL, 'd' },
@ -435,6 +435,7 @@ main(int argc, char *argv[])
{ "list", no_argument, NULL, 'l' },
{ "dumpable", no_argument, 0, 'D'},
{ "help", no_argument, NULL, 'h' },
{ "scratch", no_argument, NULL, 'S' },
{ NULL, 0, NULL, 0 },
};
@ -448,7 +449,7 @@ main(int argc, char *argv[])
uint64_t check_addr = -1;
uint32_t vm_flags = -1;
int c, i;
while ((c = getopt_long(argc, argv, "a:d:hlDs:", aubinator_opts, &i)) != -1) {
while ((c = getopt_long(argc, argv, "a:d:hlDSs:", aubinator_opts, &i)) != -1) {
switch (c) {
case 'a':
check_addr = strtol(optarg, NULL, 0);
@ -471,6 +472,9 @@ main(int argc, char *argv[])
case 'D':
bo_dumpable = true;
break;
case 'S':
scratch = true;
break;
default:
break;
}
@ -661,7 +665,7 @@ main(int argc, char *argv[])
}
if (!list && util_dynarray_num_elements(&shader_addresses, uint64_t) == 0)
replay_dmp_file(file_fd, drm_fd, &devinfo, &buffers, mem_ctx, &init, &exec, vm_flags, bo_dumpable);
replay_dmp_file(file_fd, drm_fd, &devinfo, &buffers, mem_ctx, &init, &exec, vm_flags, bo_dumpable, scratch);
close(drm_fd);
close(file_fd);

View file

@ -125,12 +125,6 @@ xe_vm_create(int drm_fd, uint32_t flags)
.flags = flags,
};
/* Mesa enforces the flag but it may go away at some point */
if (flags != (flags | DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE)) {
create.flags = flags | DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE;
fprintf(stderr, "DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE flag is now being set.\n");
}
if (flags & DRM_XE_VM_CREATE_FLAG_LR_MODE) {
fprintf(stderr, "Long running VM is not supported, aborting.\n");
exit(EXIT_FAILURE);
@ -283,7 +277,7 @@ process_xe_dmp_file(int file_fd, int drm_fd, const struct intel_device_info *dev
struct util_dynarray *buffers, void *mem_ctx,
struct intel_hang_dump_block_exec *init,
struct intel_hang_dump_block_exec *block_exec,
uint32_t vm_flags, uint32_t bo_dumpable)
uint32_t vm_flags, uint32_t bo_dumpable, bool scratch)
{
void *hw_img = NULL;
uint32_t hw_img_size = 0;
@ -300,6 +294,11 @@ process_xe_dmp_file(int file_fd, int drm_fd, const struct intel_device_info *dev
};
const uint32_t dumpable_bit = bo_dumpable ? DRM_XE_VM_BIND_FLAG_DUMPABLE : 0;
if (scratch && vm_flags != (vm_flags | DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE)) {
vm_flags |= DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE;
fprintf(stderr, "DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE flag is now being set.\n");
}
uint32_t vm = xe_vm_create(drm_fd, vm_flags);
/* Allocate BOs populate them */

View file

@ -16,4 +16,4 @@ bool process_xe_dmp_file(int file_fd, int drm_fd, const struct intel_device_info
struct util_dynarray *buffers, void *mem_ctx,
struct intel_hang_dump_block_exec *init,
struct intel_hang_dump_block_exec *exec,
uint32_t vm_uapi_flags, uint32_t bo_dumpable);
uint32_t vm_uapi_flags, uint32_t bo_dumpable, bool scratch);