Commit b38e77cb authored by Philip Yang's avatar Philip Yang Committed by Alex Deucher

drm/amdgpu: Use vm status_lock to protect relocated list

Use vm_status_lock to protect all vm_status state transitions to allow
them to happen without a reservation lock in unlocked page table
updates.
Signed-off-by: default avatarPhilip Yang <Philip.Yang@amd.com>
Acked-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 0479956c
...@@ -240,10 +240,13 @@ static void amdgpu_vm_bo_invalidated(struct amdgpu_vm_bo_base *vm_bo) ...@@ -240,10 +240,13 @@ static void amdgpu_vm_bo_invalidated(struct amdgpu_vm_bo_base *vm_bo)
*/ */
static void amdgpu_vm_bo_relocated(struct amdgpu_vm_bo_base *vm_bo) static void amdgpu_vm_bo_relocated(struct amdgpu_vm_bo_base *vm_bo)
{ {
if (vm_bo->bo->parent) if (vm_bo->bo->parent) {
spin_lock(&vm_bo->vm->status_lock);
list_move(&vm_bo->vm_status, &vm_bo->vm->relocated); list_move(&vm_bo->vm_status, &vm_bo->vm->relocated);
else spin_unlock(&vm_bo->vm->status_lock);
} else {
amdgpu_vm_bo_idle(vm_bo); amdgpu_vm_bo_idle(vm_bo);
}
} }
/** /**
...@@ -680,9 +683,14 @@ int amdgpu_vm_update_pdes(struct amdgpu_device *adev, ...@@ -680,9 +683,14 @@ int amdgpu_vm_update_pdes(struct amdgpu_device *adev,
struct amdgpu_vm_update_params params; struct amdgpu_vm_update_params params;
struct amdgpu_vm_bo_base *entry; struct amdgpu_vm_bo_base *entry;
bool flush_tlb_needed = false; bool flush_tlb_needed = false;
LIST_HEAD(relocated);
int r, idx; int r, idx;
if (list_empty(&vm->relocated)) spin_lock(&vm->status_lock);
list_splice_init(&vm->relocated, &relocated);
spin_unlock(&vm->status_lock);
if (list_empty(&relocated))
return 0; return 0;
if (!drm_dev_enter(adev_to_drm(adev), &idx)) if (!drm_dev_enter(adev_to_drm(adev), &idx))
...@@ -697,7 +705,7 @@ int amdgpu_vm_update_pdes(struct amdgpu_device *adev, ...@@ -697,7 +705,7 @@ int amdgpu_vm_update_pdes(struct amdgpu_device *adev,
if (r) if (r)
goto error; goto error;
list_for_each_entry(entry, &vm->relocated, vm_status) { list_for_each_entry(entry, &relocated, vm_status) {
/* vm_flush_needed after updating moved PDEs */ /* vm_flush_needed after updating moved PDEs */
flush_tlb_needed |= entry->moved; flush_tlb_needed |= entry->moved;
...@@ -713,9 +721,8 @@ int amdgpu_vm_update_pdes(struct amdgpu_device *adev, ...@@ -713,9 +721,8 @@ int amdgpu_vm_update_pdes(struct amdgpu_device *adev,
if (flush_tlb_needed) if (flush_tlb_needed)
atomic64_inc(&vm->tlb_seq); atomic64_inc(&vm->tlb_seq);
while (!list_empty(&vm->relocated)) { while (!list_empty(&relocated)) {
entry = list_first_entry(&vm->relocated, entry = list_first_entry(&relocated, struct amdgpu_vm_bo_base,
struct amdgpu_vm_bo_base,
vm_status); vm_status);
amdgpu_vm_bo_idle(entry); amdgpu_vm_bo_idle(entry);
} }
...@@ -912,6 +919,7 @@ void amdgpu_vm_get_memory(struct amdgpu_vm *vm, uint64_t *vram_mem, ...@@ -912,6 +919,7 @@ void amdgpu_vm_get_memory(struct amdgpu_vm *vm, uint64_t *vram_mem,
{ {
struct amdgpu_bo_va *bo_va, *tmp; struct amdgpu_bo_va *bo_va, *tmp;
spin_lock(&vm->status_lock);
list_for_each_entry_safe(bo_va, tmp, &vm->idle, base.vm_status) { list_for_each_entry_safe(bo_va, tmp, &vm->idle, base.vm_status) {
if (!bo_va->base.bo) if (!bo_va->base.bo)
continue; continue;
...@@ -936,7 +944,6 @@ void amdgpu_vm_get_memory(struct amdgpu_vm *vm, uint64_t *vram_mem, ...@@ -936,7 +944,6 @@ void amdgpu_vm_get_memory(struct amdgpu_vm *vm, uint64_t *vram_mem,
amdgpu_bo_get_memory(bo_va->base.bo, vram_mem, amdgpu_bo_get_memory(bo_va->base.bo, vram_mem,
gtt_mem, cpu_mem); gtt_mem, cpu_mem);
} }
spin_lock(&vm->status_lock);
list_for_each_entry_safe(bo_va, tmp, &vm->invalidated, base.vm_status) { list_for_each_entry_safe(bo_va, tmp, &vm->invalidated, base.vm_status) {
if (!bo_va->base.bo) if (!bo_va->base.bo)
continue; continue;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment