[PATCH 4/4] drm/amdgpu: use amdgpu_bo_dmabuf for shared prime count

Nirmoy nirmodas at amd.com
Wed Mar 17 08:27:39 UTC 2021


On 3/17/21 9:15 AM, Christian König wrote:
>
>
> Am 17.03.21 um 09:13 schrieb Nirmoy:
>>
>> On 3/17/21 9:06 AM, Christian König wrote:
>>> That whole approach won't work :)
>>>
>>> The prime_shared_count is on the exported BO and not on the imported 
>>> one.
>>>
>>> So any user BO can be exported.
>>
>>
>> So any BO from any drm driver is possible. No wonder it worked with 
>> amdgpu-amdgpu test machine.
>>
>> OK scrapping the series :/
>
> Try looking into the page table BOs, that has much more potential for 
> a cleanup than this single field here.
>
> Christian.


Thanks, checking it.


Nirmoy


>
>>
>>
>> Thanks,
>>
>> Nirmoy
>>
>>
>>>
>>> Regards,
>>> Christian.
>>>
>>> Am 17.03.21 um 08:47 schrieb Nirmoy Das:
>>>> Remove prime_shared_count from base class and use that
>>>> the subclass, amdgpu_bo_dmabuf.
>>>>
>>>> Signed-off-by: Nirmoy Das <nirmoy.das at amd.com>
>>>> ---
>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c      |  2 +-
>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c | 12 ++++++++----
>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c     |  2 +-
>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_object.c  |  2 +-
>>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_object.h  |  1 -
>>>>   5 files changed, 11 insertions(+), 8 deletions(-)
>>>>
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
>>>> index b5c766998045..04994757cc9c 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
>>>> @@ -618,7 +618,7 @@ static int amdgpu_cs_parser_bos(struct 
>>>> amdgpu_cs_parser *p,
>>>>           struct amdgpu_bo *bo = ttm_to_amdgpu_bo(e->tv.bo);
>>>>             /* Make sure we use the exclusive slot for shared BOs */
>>>> -        if (bo->prime_shared_count)
>>>> +        if (is_amdgpu_bo_dmabuf(bo))
>>>>               e->tv.num_shared = 0;
>>>>           e->bo_va = amdgpu_vm_bo_find(vm, bo);
>>>>       }
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
>>>> index e0c4f7c7f1b9..3cf57ea56499 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
>>>> @@ -143,6 +143,7 @@ static int amdgpu_dma_buf_attach(struct dma_buf 
>>>> *dmabuf,
>>>>   {
>>>>       struct drm_gem_object *obj = dmabuf->priv;
>>>>       struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj);
>>>> +    struct amdgpu_bo_dmabuf *dbo = to_amdgpu_bo_dmabuf(bo);
>>>>       struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
>>>>       int r;
>>>>   @@ -172,7 +173,7 @@ static int amdgpu_dma_buf_attach(struct 
>>>> dma_buf *dmabuf,
>>>>       if (r)
>>>>           goto out;
>>>>   -    bo->prime_shared_count++;
>>>> +    dbo->prime_shared_count++;
>>>>       amdgpu_bo_unreserve(bo);
>>>>       return 0;
>>>>   @@ -194,10 +195,11 @@ static void amdgpu_dma_buf_detach(struct 
>>>> dma_buf *dmabuf,
>>>>   {
>>>>       struct drm_gem_object *obj = dmabuf->priv;
>>>>       struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj);
>>>> +    struct amdgpu_bo_dmabuf *dbo = to_amdgpu_bo_dmabuf(bo);
>>>>       struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
>>>>   -    if (attach->dev->driver != adev->dev->driver && 
>>>> bo->prime_shared_count)
>>>> -        bo->prime_shared_count--;
>>>> +    if (attach->dev->driver != adev->dev->driver && 
>>>> dbo->prime_shared_count)
>>>> +        dbo->prime_shared_count--;
>>>> pm_runtime_mark_last_busy(adev_to_drm(adev)->dev);
>>>>       pm_runtime_put_autosuspend(adev_to_drm(adev)->dev);
>>>> @@ -431,6 +433,7 @@ amdgpu_dma_buf_create_obj(struct drm_device 
>>>> *dev, struct dma_buf *dma_buf)
>>>>       struct amdgpu_device *adev = drm_to_adev(dev);
>>>>       struct drm_gem_object *gobj;
>>>>       struct amdgpu_bo *bo;
>>>> +    struct amdgpu_bo_dmabuf *dbo;
>>>>       uint64_t flags = 0;
>>>>       int ret;
>>>>   @@ -449,10 +452,11 @@ amdgpu_dma_buf_create_obj(struct drm_device 
>>>> *dev, struct dma_buf *dma_buf)
>>>>           goto error;
>>>>         bo = gem_to_amdgpu_bo(gobj);
>>>> +    dbo = to_amdgpu_bo_dmabuf(bo);
>>>>       bo->allowed_domains = AMDGPU_GEM_DOMAIN_GTT;
>>>>       bo->preferred_domains = AMDGPU_GEM_DOMAIN_GTT;
>>>>       if (dma_buf->ops != &amdgpu_dmabuf_ops)
>>>> -        bo->prime_shared_count = 1;
>>>> +        dbo->prime_shared_count = 1;
>>>>         dma_resv_unlock(resv);
>>>>       return gobj;
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
>>>> index 5366a806be2b..7cce8aa29fd7 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
>>>> @@ -783,7 +783,7 @@ int amdgpu_gem_op_ioctl(struct drm_device *dev, 
>>>> void *data,
>>>>           break;
>>>>       }
>>>>       case AMDGPU_GEM_OP_SET_PLACEMENT:
>>>> -        if (robj->prime_shared_count && (args->value & 
>>>> AMDGPU_GEM_DOMAIN_VRAM)) {
>>>> +        if (is_amdgpu_bo_dmabuf(robj) && (args->value & 
>>>> AMDGPU_GEM_DOMAIN_VRAM)) {
>>>>               r = -EINVAL;
>>>>               amdgpu_bo_unreserve(robj);
>>>>               break;
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c 
>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>>>> index ad615eec1e8c..435bf85991e5 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>>>> @@ -965,7 +965,7 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo 
>>>> *bo, u32 domain,
>>>>           return -EINVAL;
>>>>         /* A shared bo cannot be migrated to VRAM */
>>>> -    if (bo->prime_shared_count || bo->tbo.base.import_attach) {
>>>> +    if (is_amdgpu_bo_dmabuf(bo) || bo->tbo.base.import_attach) {
>>>>           if (domain & AMDGPU_GEM_DOMAIN_GTT)
>>>>               domain = AMDGPU_GEM_DOMAIN_GTT;
>>>>           else
>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h 
>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
>>>> index 3d23ad247b1b..2f1abcc4e1e7 100644
>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
>>>> @@ -93,7 +93,6 @@ struct amdgpu_bo {
>>>>       struct ttm_buffer_object    tbo;
>>>>       struct ttm_bo_kmap_obj        kmap;
>>>>       u64                flags;
>>>> -    unsigned            prime_shared_count;
>>>>       /* per VM structure for page tables and with virtual 
>>>> addresses */
>>>>       struct amdgpu_vm_bo_base    *vm_bo;
>>>>       /* Constant after initialization */
>>>
>


More information about the amd-gfx mailing list