amd-gfx Digest, Vol 70, Issue 199

Yat Sin, David David.YatSin at amd.com
Thu Mar 17 01:57:27 UTC 2022



> 
> Use proper amdgpu_gem_prime_import function to handle all kinds of
> imports. Remember the dmabuf reference to enable proper multi-GPU
> attachment to multiple VMs without erroneously re-exporting the underlying
> BO multiple times.
> 
> Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com>
> ---
>  .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c  | 38 ++++++++++--------
> -
>  1 file changed, 21 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
> index cd89d2e46852..2ac61a1e665e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
> @@ -2033,30 +2033,27 @@ int
> amdgpu_amdkfd_gpuvm_import_dmabuf(struct amdgpu_device *adev,
>  	struct amdgpu_bo *bo;
>  	int ret;
> 
> -	if (dma_buf->ops != &amdgpu_dmabuf_ops)
> -		/* Can't handle non-graphics buffers */
> -		return -EINVAL;
> -
> -	obj = dma_buf->priv;
> -	if (drm_to_adev(obj->dev) != adev)
> -		/* Can't handle buffers from other devices */
> -		return -EINVAL;
> +	obj = amdgpu_gem_prime_import(adev_to_drm(adev), dma_buf);
> +	if (IS_ERR(obj))
> +		return PTR_ERR(obj);
> 
>  	bo = gem_to_amdgpu_bo(obj);
>  	if (!(bo->preferred_domains & (AMDGPU_GEM_DOMAIN_VRAM |
> -				    AMDGPU_GEM_DOMAIN_GTT)))
> +				    AMDGPU_GEM_DOMAIN_GTT))) {
>  		/* Only VRAM and GTT BOs are supported */
> -		return -EINVAL;
> +		ret = -EINVAL;
> +		goto err_put_obj;
> +	}
> 
>  	*mem = kzalloc(sizeof(struct kgd_mem), GFP_KERNEL);
> -	if (!*mem)
> -		return -ENOMEM;
> +	if (!*mem) {
> +		ret = -ENOMEM;
> +		goto err_put_obj;
> +	}
> 
>  	ret = drm_vma_node_allow(&obj->vma_node, drm_priv);
> -	if (ret) {
> -		kfree(mem);
> -		return ret;
> -	}
> +	if (ret)
> +		goto err_free_mem;
> 
>  	if (size)
>  		*size = amdgpu_bo_size(bo);
> @@ -2073,7 +2070,8 @@ int
> amdgpu_amdkfd_gpuvm_import_dmabuf(struct amdgpu_device *adev,
>  		| KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE
>  		| KFD_IOC_ALLOC_MEM_FLAGS_EXECUTABLE;
> 
> -	drm_gem_object_get(&bo->tbo.base);
> +	get_dma_buf(dma_buf);
> +	(*mem)->dmabuf = dma_buf;
>  	(*mem)->bo = bo;
>  	(*mem)->va = va;
>  	(*mem)->domain = (bo->preferred_domains &
> AMDGPU_GEM_DOMAIN_VRAM) ?
> @@ -2085,6 +2083,12 @@ int
> amdgpu_amdkfd_gpuvm_import_dmabuf(struct amdgpu_device *adev,
>  	(*mem)->is_imported = true;
> 
>  	return 0;
> +
> +err_free_mem:
> +	kfree(mem);

Should be kfree(*mem)

Regards,
David

> +err_put_obj:
> +	drm_gem_object_put(obj);
> +	return ret;
>  }
> 
>  /* Evict a userptr BO by stopping the queues if necessary



More information about the dri-devel mailing list