Commit 21abf108 authored by Matthew Brost's avatar Matthew Brost Committed by Thomas Hellström
Browse files

drm/xe: Pick correct userptr VMA to repin on REMAP op failure



A REMAP op is composed of 3 VMA's - unmap, prev map, and next map. When
op_execute fails with -EAGAIN we need to update the local VMA pointer to
the current op state and then repin the VMA if it is a userptr.

Fixes a failure seen in xe_vm.munmap-style-unbind-userptr-one-partial.

Fixes: b06d47be ("drm/xe: Port Xe to GPUVA")
Signed-off-by: default avatarMatthew Brost <matthew.brost@intel.com>
Reviewed-by: default avatarMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240201004849.2219558-3-matthew.brost@intel.com


(cherry picked from commit 447f74d2)
Signed-off-by: default avatarThomas Hellström <thomas.hellstrom@linux.intel.com>
parent fc29b6d5
Loading
Loading
Loading
Loading
+17 −5
Original line number Diff line number Diff line
@@ -2531,14 +2531,26 @@ static int __xe_vma_op_execute(struct xe_vm *vm, struct xe_vma *vma,
	}
	drm_exec_fini(&exec);

	if (err == -EAGAIN && xe_vma_is_userptr(vma)) {
	if (err == -EAGAIN) {
		lockdep_assert_held_write(&vm->lock);

		if (op->base.op == DRM_GPUVA_OP_REMAP) {
			if (!op->remap.unmap_done)
				vma = gpuva_to_vma(op->base.remap.unmap->va);
			else if (op->remap.prev)
				vma = op->remap.prev;
			else
				vma = op->remap.next;
		}

		if (xe_vma_is_userptr(vma)) {
			err = xe_vma_userptr_pin_pages(to_userptr_vma(vma));
			if (!err)
				goto retry_userptr;

			trace_xe_vma_fail(vma);
		}
	}

	return err;
}