drm/xe: Retry BO allocation
authorMatthew Brost <matthew.brost@intel.com>
Thu, 6 Mar 2025 01:26:26 +0000 (17:26 -0800)
committerMatthew Brost <matthew.brost@intel.com>
Thu, 6 Mar 2025 19:35:22 +0000 (11:35 -0800)
TTM doesn't support fair eviction via WW locking, this mitigated in by
using retry loops in exec and preempt rebind worker. Extend this retry
loop to BO allocation. Once TTM supports fair eviction this patch can be
reverted.

v4:
 - Keep line break (Stuart)

Signed-off-by: Matthew Brost <matthew.brost@intel.com>
Reviewed-by: Gwan-gyeong Mun <gwan-gyeong.mun@intel.com>
Reviewed-by: Stuart Summers <stuart.summers@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250306012657.3505757-2-matthew.brost@intel.com
drivers/gpu/drm/xe/xe_bo.c

index 25761924a8b413ae1a23cc3c15c182283a295ceb..9adc63175e69b19e2732d7ab27785d04adab03a0 100644 (file)
@@ -2273,6 +2273,7 @@ int xe_gem_create_ioctl(struct drm_device *dev, void *data,
        struct xe_file *xef = to_xe_file(file);
        struct drm_xe_gem_create *args = data;
        struct xe_vm *vm = NULL;
+       ktime_t end = 0;
        struct xe_bo *bo;
        unsigned int bo_flags;
        u32 handle;
@@ -2344,6 +2345,10 @@ int xe_gem_create_ioctl(struct drm_device *dev, void *data,
                vm = xe_vm_lookup(xef, args->vm_id);
                if (XE_IOCTL_DBG(xe, !vm))
                        return -ENOENT;
+       }
+
+retry:
+       if (vm) {
                err = xe_vm_lock(vm, true);
                if (err)
                        goto out_vm;
@@ -2357,6 +2362,8 @@ int xe_gem_create_ioctl(struct drm_device *dev, void *data,
 
        if (IS_ERR(bo)) {
                err = PTR_ERR(bo);
+               if (xe_vm_validate_should_retry(NULL, err, &end))
+                       goto retry;
                goto out_vm;
        }