]> www.infradead.org Git - users/hch/misc.git/commitdiff
drm/xe/display: Convert __xe_pin_fb_vma()
authorThomas Hellström <thomas.hellstrom@linux.intel.com>
Mon, 8 Sep 2025 10:12:40 +0000 (12:12 +0200)
committerThomas Hellström <thomas.hellstrom@linux.intel.com>
Wed, 10 Sep 2025 07:16:02 +0000 (09:16 +0200)
Convert __xe_pin_fb_vma() for exhaustive eviction
using xe_validation_guard().

v2:
- Avoid gotos from within xe_validation_guard(). (Matt Brost)
- Adapt to signature change of xe_validation_guard(). (Matt Brost)
- Use interruptible waiting, since xe_bo_migrate() already does that.

Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Link: https://lore.kernel.org/r/20250908101246.65025-8-thomas.hellstrom@linux.intel.com
drivers/gpu/drm/xe/display/xe_fb_pin.c

index 3406dca285bdd86e0c645c7877033f4127a01fe1..a5c35e9ff2ef14f8af81118ab743253deeb3154e 100644 (file)
@@ -281,7 +281,8 @@ static struct i915_vma *__xe_pin_fb_vma(const struct intel_framebuffer *fb,
        struct i915_vma *vma = kzalloc(sizeof(*vma), GFP_KERNEL);
        struct drm_gem_object *obj = intel_fb_bo(&fb->base);
        struct xe_bo *bo = gem_to_xe_bo(obj);
-       struct drm_exec *exec = XE_VALIDATION_UNIMPLEMENTED;
+       struct xe_validation_ctx ctx;
+       struct drm_exec exec;
        int ret;
 
        if (!vma)
@@ -309,17 +310,22 @@ static struct i915_vma *__xe_pin_fb_vma(const struct intel_framebuffer *fb,
         * Pin the framebuffer, we can't use xe_bo_(un)pin functions as the
         * assumptions are incorrect for framebuffers
         */
-       ret = ttm_bo_reserve(&bo->ttm, false, false, NULL);
-       if (ret)
-               goto err;
-
-       if (IS_DGFX(xe))
-               ret = xe_bo_migrate(bo, XE_PL_VRAM0, NULL, exec);
-       else
-               ret = xe_bo_validate(bo, NULL, true, exec);
-       if (!ret)
-               ttm_bo_pin(&bo->ttm);
-       ttm_bo_unreserve(&bo->ttm);
+       xe_validation_guard(&ctx, &xe->val, &exec, (struct xe_val_flags) {.interruptible = true},
+                           ret) {
+               ret = drm_exec_lock_obj(&exec, &bo->ttm.base);
+               drm_exec_retry_on_contention(&exec);
+               if (ret)
+                       break;
+
+               if (IS_DGFX(xe))
+                       ret = xe_bo_migrate(bo, XE_PL_VRAM0, NULL, &exec);
+               else
+                       ret = xe_bo_validate(bo, NULL, true, &exec);
+               drm_exec_retry_on_contention(&exec);
+               xe_validation_retry_on_oom(&ctx, &ret);
+               if (!ret)
+                       ttm_bo_pin(&bo->ttm);
+       }
        if (ret)
                goto err;