[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:06:13 UTC 2021


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.

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