]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/xe: Use ttm_bo_access in xe_vm_snapshot_capture_delayed
authorMatthew Brost <matthew.brost@intel.com>
Tue, 26 Nov 2024 17:46:13 +0000 (09:46 -0800)
committerMatthew Brost <matthew.brost@intel.com>
Thu, 28 Nov 2024 00:38:54 +0000 (16:38 -0800)
Non-contiguous mapping of BO in VRAM doesn't work, use ttm_bo_access
instead.

v2:
 - Fix error handling

Fixes: 0eb2a18a8fad ("drm/xe: Implement VM snapshot support for BO's and userptr")
Suggested-by: Matthew Auld <matthew.auld@intel.com>
Signed-off-by: Matthew Brost <matthew.brost@intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241126174615.2665852-7-matthew.brost@intel.com
drivers/gpu/drm/xe/xe_vm.c

index 2e67648ed512194a910e1d78869b4e046f69b666..610226c7c1cef78fd74a869d8b351094c4594ce8 100644 (file)
@@ -3310,7 +3310,6 @@ void xe_vm_snapshot_capture_delayed(struct xe_vm_snapshot *snap)
 
        for (int i = 0; i < snap->num_snaps; i++) {
                struct xe_bo *bo = snap->snap[i].bo;
-               struct iosys_map src;
                int err;
 
                if (IS_ERR(snap->snap[i].data))
@@ -3323,16 +3322,12 @@ void xe_vm_snapshot_capture_delayed(struct xe_vm_snapshot *snap)
                }
 
                if (bo) {
-                       xe_bo_lock(bo, false);
-                       err = ttm_bo_vmap(&bo->ttm, &src);
-                       if (!err) {
-                               xe_map_memcpy_from(xe_bo_device(bo),
-                                                  snap->snap[i].data,
-                                                  &src, snap->snap[i].bo_ofs,
-                                                  snap->snap[i].len);
-                               ttm_bo_vunmap(&bo->ttm, &src);
-                       }
-                       xe_bo_unlock(bo);
+                       err = ttm_bo_access(&bo->ttm, snap->snap[i].bo_ofs,
+                                           snap->snap[i].data, snap->snap[i].len, 0);
+                       if (!(err < 0) && err != snap->snap[i].len)
+                               err = -EIO;
+                       else if (!(err < 0))
+                               err = 0;
                } else {
                        void __user *userptr = (void __user *)(size_t)snap->snap[i].bo_ofs;