drm/amdgpu: minor optimize VM moved handling v2

Try to lock moved BOs if it's successful we can update the
PTEs directly to the new location.

v2: rebase

Signed-off-by: Christian König <christian.koenig@amd.com>
Acked-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Christian König 2017-09-01 20:34:27 +02:00 committed by Alex Deucher
parent 4d4358f3f1
commit ec363e0dae
1 changed files with 14 additions and 1 deletions

View File

@ -1697,18 +1697,31 @@ int amdgpu_vm_handle_moved(struct amdgpu_device *adev,
spin_lock(&vm->status_lock); spin_lock(&vm->status_lock);
while (!list_empty(&vm->moved)) { while (!list_empty(&vm->moved)) {
struct amdgpu_bo_va *bo_va; struct amdgpu_bo_va *bo_va;
struct reservation_object *resv;
bo_va = list_first_entry(&vm->moved, bo_va = list_first_entry(&vm->moved,
struct amdgpu_bo_va, base.vm_status); struct amdgpu_bo_va, base.vm_status);
spin_unlock(&vm->status_lock); spin_unlock(&vm->status_lock);
resv = bo_va->base.bo->tbo.resv;
/* Per VM BOs never need to bo cleared in the page tables */ /* Per VM BOs never need to bo cleared in the page tables */
clear = bo_va->base.bo->tbo.resv != vm->root.base.bo->tbo.resv; if (resv == vm->root.base.bo->tbo.resv)
clear = false;
/* Try to reserve the BO to avoid clearing its ptes */
else if (reservation_object_trylock(resv))
clear = false;
/* Somebody else is using the BO right now */
else
clear = true;
r = amdgpu_vm_bo_update(adev, bo_va, clear); r = amdgpu_vm_bo_update(adev, bo_va, clear);
if (r) if (r)
return r; return r;
if (!clear && resv != vm->root.base.bo->tbo.resv)
reservation_object_unlock(resv);
spin_lock(&vm->status_lock); spin_lock(&vm->status_lock);
} }
spin_unlock(&vm->status_lock); spin_unlock(&vm->status_lock);