drm/xe: Use ttm_bo_access in xe_vm_snapshot_capture_delayed

Non-contiguous mapping of BO in VRAM doesn't work, use ttm_bo_access
instead.

v2:
 - Fix error handling

Fixes: 0eb2a18a8f ("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
This commit is contained in:
Matthew Brost 2024-11-26 09:46:13 -08:00
parent b6308aaa24
commit 5f7bec831f

View 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;