[RFC 09/12] drm/xe/svm: Allow unaligned addresses and ranges for prefetch
Himal Prasad Ghimiray
himal.prasad.ghimiray at intel.com
Mon Mar 10 12:43:38 UTC 2025
The SVM prefetch operation can handle unaligned addresses and range sizes.
This commit updates the ioctl parameter checks to accommodate unaligned
addresses and range sizes for SVM prefetch operations.
Signed-off-by: Himal Prasad Ghimiray <himal.prasad.ghimiray at intel.com>
---
drivers/gpu/drm/xe/xe_vm.c | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
index a54e78621074..8d2db9d47561 100644
--- a/drivers/gpu/drm/xe/xe_vm.c
+++ b/drivers/gpu/drm/xe/xe_vm.c
@@ -3089,6 +3089,16 @@ ALLOW_ERROR_INJECTION(vm_bind_ioctl_ops_execute, ERRNO);
#define XE_64K_PAGE_MASK 0xffffull
#define ALL_DRM_XE_SYNCS_FLAGS (DRM_XE_SYNCS_FLAG_WAIT_FOR_OP)
+static bool addr_not_in_cpu_addr_vma(struct xe_vm *vm, u64 addr)
+{
+ struct xe_vma *vma;
+
+ down_write(&vm->lock);
+ vma = xe_vm_find_vma_by_addr(vm, addr);
+ up_write(&vm->lock);
+ return !xe_vma_is_cpu_addr_mirror(vma);
+}
+
static int vm_bind_ioctl_check_args(struct xe_device *xe, struct xe_vm *vm,
struct drm_xe_vm_bind *args,
struct drm_xe_vm_bind_op **bind_ops)
@@ -3197,8 +3207,12 @@ static int vm_bind_ioctl_check_args(struct xe_device *xe, struct xe_vm *vm,
}
if (XE_IOCTL_DBG(xe, obj_offset & ~PAGE_MASK) ||
- XE_IOCTL_DBG(xe, addr & ~PAGE_MASK) ||
- XE_IOCTL_DBG(xe, range & ~PAGE_MASK) ||
+ XE_IOCTL_DBG(xe, (addr & ~PAGE_MASK) &&
+ (addr_not_in_cpu_addr_vma(vm, addr) ||
+ op != DRM_XE_VM_BIND_OP_PREFETCH)) ||
+ XE_IOCTL_DBG(xe, (range & ~PAGE_MASK) &&
+ (addr_not_in_cpu_addr_vma(vm, addr) ||
+ op != DRM_XE_VM_BIND_OP_PREFETCH)) ||
XE_IOCTL_DBG(xe, !range &&
op != DRM_XE_VM_BIND_OP_UNMAP_ALL)) {
err = -EINVAL;
--
2.34.1
More information about the Intel-xe
mailing list