mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-18 11:33:36 -04:00
drm/amdkfd: Implement DMA buf fd export from KFD
Exports a DMA buf fd of a given KFD buffer handle. This is intended for being able to import KFD BOs into GEM contexts to leverage the amdgpu_bo_va API for more flexible virtual address mappings. It will also be used for the new upstreamable RDMA solution coming to UCX and RCCL. The corresponding user mode change (Thunk API and kfdtest) is here: https://github.com/fxkamd/ROCT-Thunk-Interface/commits/fxkamd/dmabuf Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com> Acked-by: Christian König <christian.koenig@amd.com> Reviewed-by: Xiaogang Chen <Xiaogang.Chen@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
committed by
Alex Deucher
parent
2d81c4cd78
commit
fd234e7581
@@ -711,6 +711,21 @@ kfd_mem_dmaunmap_attachment(struct kgd_mem *mem,
|
||||
}
|
||||
}
|
||||
|
||||
static int kfd_mem_export_dmabuf(struct kgd_mem *mem)
|
||||
{
|
||||
if (!mem->dmabuf) {
|
||||
struct dma_buf *ret = amdgpu_gem_prime_export(
|
||||
&mem->bo->tbo.base,
|
||||
mem->alloc_flags & KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE ?
|
||||
DRM_RDWR : 0);
|
||||
if (IS_ERR(ret))
|
||||
return PTR_ERR(ret);
|
||||
mem->dmabuf = ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
kfd_mem_attach_dmabuf(struct amdgpu_device *adev, struct kgd_mem *mem,
|
||||
struct amdgpu_bo **bo)
|
||||
@@ -718,16 +733,9 @@ kfd_mem_attach_dmabuf(struct amdgpu_device *adev, struct kgd_mem *mem,
|
||||
struct drm_gem_object *gobj;
|
||||
int ret;
|
||||
|
||||
if (!mem->dmabuf) {
|
||||
mem->dmabuf = amdgpu_gem_prime_export(&mem->bo->tbo.base,
|
||||
mem->alloc_flags & KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE ?
|
||||
DRM_RDWR : 0);
|
||||
if (IS_ERR(mem->dmabuf)) {
|
||||
ret = PTR_ERR(mem->dmabuf);
|
||||
mem->dmabuf = NULL;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
ret = kfd_mem_export_dmabuf(mem);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
gobj = amdgpu_gem_prime_import(adev_to_drm(adev), mem->dmabuf);
|
||||
if (IS_ERR(gobj))
|
||||
@@ -2268,6 +2276,23 @@ err_put_obj:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int amdgpu_amdkfd_gpuvm_export_dmabuf(struct kgd_mem *mem,
|
||||
struct dma_buf **dma_buf)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mutex_lock(&mem->lock);
|
||||
ret = kfd_mem_export_dmabuf(mem);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
get_dma_buf(mem->dmabuf);
|
||||
*dma_buf = mem->dmabuf;
|
||||
out:
|
||||
mutex_unlock(&mem->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Evict a userptr BO by stopping the queues if necessary
|
||||
*
|
||||
* Runs in MMU notifier, may be in RECLAIM_FS context. This means it
|
||||
|
||||
Reference in New Issue
Block a user