the vma::rebind_link is protected by the vm's resv, but we was modifying it without. Fix this by use the vma::userptr_link instead for the tmp_evict list. The vma::userptr_link is protected by the vm lock. Signed-off-by: Thomas Hellström <thomas.hellstrom@xxxxxxxxxxxxxxx> --- drivers/gpu/drm/xe/xe_vm.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c index 0a4becdf4675..5f93d78c2e58 100644 --- a/drivers/gpu/drm/xe/xe_vm.c +++ b/drivers/gpu/drm/xe/xe_vm.c @@ -764,8 +764,7 @@ int xe_vm_userptr_pin(struct xe_vm *vm) if (err < 0) goto out_err; - list_del_init(&vma->userptr_link); - list_move_tail(&vma->rebind_link, &tmp_evict); + list_move_tail(&vma->userptr_link, &tmp_evict); } /* Take lock and move to rebind_list for rebinding. */ @@ -773,16 +772,17 @@ int xe_vm_userptr_pin(struct xe_vm *vm) if (err) goto out_err; - list_splice_tail(&tmp_evict, &vm->rebind_list); + list_for_each_entry_safe(vma, next, &tmp_evict, userptr_link) { + list_del_init(&vma->userptr_link); + list_move_tail(&vma->rebind_link, &vm->rebind_list); + } + dma_resv_unlock(&vm->resv); return 0; out_err: - list_for_each_entry_safe(vma, next, &tmp_evict, rebind_link) { - list_del_init(&vma->rebind_link); - list_add_tail(&vma->userptr_link, &vm->userptr.repin_list); - } + list_splice_tail(&tmp_evict, &vm->userptr.repin_list); return err; } -- 2.39.2