BOs need to be reserved before they are added or removed, so ensure that
they are reserved during kfd_mem_attach and kfd_mem_detach

Signed-off-by: Kent Russell <kent.russ...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
index 61784bbfd7fd..8d30ccd70800 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
@@ -798,14 +798,19 @@ static int kfd_mem_attach(struct amdgpu_device *adev, 
struct kgd_mem *mem,
                }
 
                /* Add BO to VM internal data structures */
+               ret = amdgpu_bo_reserve(bo[i], false);
+               if (ret) {
+                       pr_debug("Unable to reserve BO during memory attach");
+                       goto unwind;
+               }
                attachment[i]->bo_va = amdgpu_vm_bo_add(adev, vm, bo[i]);
+               amdgpu_bo_unreserve(bo[i]);
                if (unlikely(!attachment[i]->bo_va)) {
                        ret = -ENOMEM;
                        pr_err("Failed to add BO object to VM. ret == %d\n",
                               ret);
                        goto unwind;
                }
-
                attachment[i]->va = va;
                attachment[i]->pte_flags = get_pte_flags(adev, mem);
                attachment[i]->adev = adev;
@@ -821,7 +826,9 @@ static int kfd_mem_attach(struct amdgpu_device *adev, 
struct kgd_mem *mem,
                if (!attachment[i])
                        continue;
                if (attachment[i]->bo_va) {
+                       amdgpu_bo_reserve(bo[i], true);
                        amdgpu_vm_bo_rmv(adev, attachment[i]->bo_va);
+                       amdgpu_bo_unreserve(bo[i]);
                        list_del(&attachment[i]->list);
                }
                if (bo[i])
@@ -1700,12 +1707,12 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
        pr_debug("Release VA 0x%llx - 0x%llx\n", mem->va,
                mem->va + bo_size * (1 + mem->aql_queue));
 
-       ret = unreserve_bo_and_vms(&ctx, false, false);
-
        /* Remove from VM internal data structures */
        list_for_each_entry_safe(entry, tmp, &mem->attachments, list)
                kfd_mem_detach(entry);
 
+       ret = unreserve_bo_and_vms(&ctx, false, false);
+
        /* Free the sync object */
        amdgpu_sync_free(&mem->sync);
 
-- 
2.25.1

Reply via email to