]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/xe: Handle mixed mappings and existing VRAM on atomic faults
authorMatthew Brost <matthew.brost@intel.com>
Thu, 9 Oct 2025 13:06:29 +0000 (06:06 -0700)
committerLucas De Marchi <lucas.demarchi@intel.com>
Mon, 13 Oct 2025 20:03:15 +0000 (13:03 -0700)
Moving to VRAM will fail if mixed mappings are present or if the page is
already located in VRAM. Atomic faults that require a move to VRAM
currently retry without attempting to evict mixed mappings or locate
existing VRAM mappings.

This patch fixes the issue by attempting to evict mixed mappings or find
existing VRAM pages when a move to VRAM fails during atomic fault
handling.

Fixes: a9ac0fa455b0 ("drm/xe: Strict migration policy for atomic SVM faults")
Signed-off-by: Matthew Brost <matthew.brost@intel.com>
Reviewed-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Link: https://lore.kernel.org/r/20251009130629.3531962-1-matthew.brost@intel.com
(cherry picked from commit 75188605c56d10c1bd3b1cd94f4872f349c3a9c8)
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
drivers/gpu/drm/xe/xe_svm.c

index 7e2db71ff34eeb37b70e8c59a73cdac15c218832..b268ee0d227106ddf71976f728083883ef00e66e 100644 (file)
@@ -1073,7 +1073,17 @@ retry:
                                drm_dbg(&vm->xe->drm,
                                        "VRAM allocation failed, falling back to retrying fault, asid=%u, errno=%pe\n",
                                        vm->usm.asid, ERR_PTR(err));
-                               goto retry;
+
+                               /*
+                                * In the devmem-only case, mixed mappings may
+                                * be found. The get_pages function will fix
+                                * these up to a single location, allowing the
+                                * page fault handler to make forward progress.
+                                */
+                               if (ctx.devmem_only)
+                                       goto get_pages;
+                               else
+                                       goto retry;
                        } else {
                                drm_err(&vm->xe->drm,
                                        "VRAM allocation failed, retry count exceeded, asid=%u, errno=%pe\n",
@@ -1083,6 +1093,7 @@ retry:
                }
        }
 
+get_pages:
        get_pages_start = xe_svm_stats_ktime_get();
 
        range_debug(range, "GET PAGES");