GEM code should not deal with struct amdgpu_bo_va's ref_count.
Move ref counting to amdgpu_vm.c.
Signed-off-by: Nirmoy Das <nirmoy.das@xxxxxxx>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 11 +++----
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 38 +++++++++++++++++++++++--
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 2 ++
3 files changed, 42 insertions(+), 9 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
index 4a11a2f4fa73..691f0a879c90 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
@@ -176,12 +176,9 @@ static int amdgpu_gem_object_open(struct
drm_gem_object *obj,
if (r)
return r;
- bo_va = amdgpu_vm_bo_find(vm, abo);
- if (!bo_va) {
- bo_va = amdgpu_vm_bo_add(adev, vm, abo);
- } else {
- ++bo_va->ref_count;
- }
+ if (!amdgpu_vm_bo_get(vm, abo))
+ amdgpu_vm_bo_add(adev, vm, abo);
+
amdgpu_bo_unreserve(abo);
return 0;
}
@@ -218,7 +215,7 @@ static void amdgpu_gem_object_close(struct
drm_gem_object *obj,
return;
}
bo_va = amdgpu_vm_bo_find(vm, bo);
- if (!bo_va || --bo_va->ref_count)
+ if (!bo_va)
goto out_unlock;
amdgpu_vm_bo_rmv(adev, bo_va);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index b23cb463b106..9d60de6a6697 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -1290,16 +1290,49 @@ struct amdgpu_bo_va *amdgpu_vm_bo_find(struct
amdgpu_vm *vm,
struct amdgpu_bo *bo)
{
struct amdgpu_vm_bo_base *base;
+ struct amdgpu_bo_va *bo_va = NULL;
for (base = bo->vm_bo; base; base = base->next) {
if (base->vm != vm)
continue;
- return container_of(base, struct amdgpu_bo_va, base);
+ bo_va = container_of(base, struct amdgpu_bo_va, base);
}
- return NULL;
+
+ if (bo_va && bo_va->ref_count <= 0)
+ return NULL;
+
+ return bo_va;
}
+/**
+ * amdgpu_vm_bo_get - find the bo_va for a specific vm & bo and
increase
+ * the ref_count
+ *
+ * @vm: requested vm
+ * @bo: requested buffer object
+ *
+ * Find @bo inside the requested vm.
+ * Search inside the @bos vm list for the requested vm
+ * Returns the found bo_va with +1 ref_count or NULL if none is found
+ *
+ * Object has to be reserved!
+ *
+ * Returns:
+ * Found bo_va or NULL.
+ */
+struct amdgpu_bo_va *amdgpu_vm_bo_get(struct amdgpu_vm *vm,
+ struct amdgpu_bo *bo)
+{
+ struct amdgpu_bo_va *bo_va = amdgpu_vm_bo_find(vm, bo);
+
+ if (bo_va)
+ ++bo_va->ref_count;
+
+ return bo_va;
+}
+
+
/**
* amdgpu_vm_map_gart - Resolve gart mapping of addr
*
@@ -2704,6 +2737,7 @@ void amdgpu_vm_bo_rmv(struct amdgpu_device *adev,
if (bo && bo_va->is_xgmi)
amdgpu_xgmi_set_pstate(adev, AMDGPU_XGMI_PSTATE_MIN);
+ --bo_va->ref_count;
kfree(bo_va);