mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 20:18:12 +02:00
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:
parent
04bfdb287b
commit
ebe835e94c
3 changed files with 16 additions and 13 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue