History

drm/xe: Allow scratch page under fault mode for certain platform

Normally scratch page is not allowed when a vm is operate under page fault mode, i.e., in the existing codes, DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE and DRM_XE_VM_CREATE_FLAG_FAULT_MODE are mutual exclusive. The reason is fault mode relies on recoverable page to work, while scratch page can mute recoverable page fault. On xe2 and xe3, out of bound prefetch can cause page fault and further system hang because xekmd can't resolve such page fault. SYCL and OCL language runtime requires out of bound prefetch to be silently dropped without causing any functional problem, thus the existing behavior doesn't meet language runtime requirement. At the same time, HW prefetching can cause page fault interrupt. Due to page fault interrupt overhead (i.e., need Guc and KMD involved to fix the page fault), HW prefetching can be slowed by many orders of magnitude. Fix those problems by allowing scratch page under fault mode for xe2 and xe3. With scratch page in place, HW prefetching could always hit scratch page instead of causing interrupt. A side effect is, scratch page could hide application program error. Application out of bound accesses are hided by scratch page mapping, instead of get reported to user. v2: Refine commit message (Thomas) v3: Move the scratch page flag check to after scratch page wa (Thomas) v4: drop NEEDS_SCRATCH macro (matt) Add a comment to DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE

Oak Zeng committed 1 year ago

Commit ae28e341 parent 5b658b72 files · +7 −2Browse files

Unified · Split

2 files
  1. drivers/gpu/drm/xe/xe_vm.c +2 −1
  2. include/uapi/drm/xe_drm.h +5 −1
drivers/gpu/drm/xe/xe_vm.c+2−1
@@ -2049,7 +2049,8 @@ int xe_vm_create_ioctl(struct drm_device *dev, void *data, · 2048 unmodified lines
20492049 return -EINVAL;
20502050
20512051 if (XE_IOCTL_DBG(xe, args->flags & DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE &&
2052− args->flags & DRM_XE_VM_CREATE_FLAG_FAULT_MODE))
2052+ args->flags & DRM_XE_VM_CREATE_FLAG_FAULT_MODE &&
2053+ !xe->info.needs_scratch))
20532054 return -EINVAL;
20542055
20552056 if (XE_IOCTL_DBG(xe, !(args->flags & DRM_XE_VM_CREATE_FLAG_LR_MODE) &&
include/uapi/drm/xe_drm.h+5−1
@@ -917,7 +917,11 @@ struct drm_xe_gem_mmap_offset { · 916 unmodified lines
917917 * struct drm_xe_vm_create - Input of &DRM_IOCTL_XE_VM_CREATE
918918 *
919919 * The @flags can be:
920− * - %DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE
920+ * - %DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE - Map the whole virtual address
921+ * space of the VM to scratch page. A vm_bind would overwrite the scratch
922+ * page mapping. This flag is mutually exclusive with the
923+ * %DRM_XE_VM_CREATE_FLAG_FAULT_MODE flag, with an exception of on x2 and
924+ * xe3 platform.
921925 * - %DRM_XE_VM_CREATE_FLAG_LR_MODE - An LR, or Long Running VM accepts
922926 * exec submissions to its exec_queues that don't have an upper time
923927 * limit on the job execution time. But exec submissions to these