[PATCH 1/1] drm/amdgpu: move bo_va ref counting to internal funcs
Das, Nirmoy
nirmoy.das at amd.com
Thu Jan 13 12:18:34 UTC 2022
On 1/13/2022 1:12 PM, Christian König wrote:
>
>
> Am 13.01.22 um 13:06 schrieb Nirmoy Das:
>> 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 at amd.com>
>> ---
>> 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);
>
> That here won't work, you are removing and freeing the bo_va even if
> the refcount is not zero yet.
>
> I suggest to have a matching amdgpu_vm_bo_put() function instead.
Right, let me resend v2.
Thanks,
Nirmoy
>
> Regards,
> Christian.
>
>> }
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
>> index 85fcfb8c5efd..6d936fb1b934 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
>> @@ -415,6 +415,8 @@ void amdgpu_vm_bo_invalidate(struct amdgpu_device
>> *adev,
>> uint64_t amdgpu_vm_map_gart(const dma_addr_t *pages_addr, uint64_t
>> addr);
>> struct amdgpu_bo_va *amdgpu_vm_bo_find(struct amdgpu_vm *vm,
>> struct amdgpu_bo *bo);
>> +struct amdgpu_bo_va *amdgpu_vm_bo_get(struct amdgpu_vm *vm,
>> + struct amdgpu_bo *bo);
>> struct amdgpu_bo_va *amdgpu_vm_bo_add(struct amdgpu_device *adev,
>> struct amdgpu_vm *vm,
>> struct amdgpu_bo *bo);
>
More information about the amd-gfx
mailing list