[PATCH 4/4] drm/amdgpu: use amdgpu_bo_dmabuf for shared prime count
Christian König
christian.koenig at amd.com
Wed Mar 17 08:15:02 UTC 2021
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,
>
> 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