mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-18 03:23:53 -04:00
drm/amdkfd: Export DMABufs from KFD using GEM handles
Create GEM handles for exporting DMABufs using GEM-Prime APIs. The GEM handles are created in a drm_client_dev context to avoid exposing them in user mode contexts through a DMABuf import. Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com> Reviewed-by: Ramesh Errabolu <Ramesh.Errabolu@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
committed by
Alex Deucher
parent
4e95669ecb
commit
1819200166
@@ -25,6 +25,7 @@
|
||||
#include <linux/pagemap.h>
|
||||
#include <linux/sched/mm.h>
|
||||
#include <linux/sched/task.h>
|
||||
#include <linux/fdtable.h>
|
||||
#include <drm/ttm/ttm_tt.h>
|
||||
|
||||
#include <drm/drm_exec.h>
|
||||
@@ -806,13 +807,22 @@ 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,
|
||||
struct amdgpu_device *bo_adev;
|
||||
struct dma_buf *dmabuf;
|
||||
int r, fd;
|
||||
|
||||
bo_adev = amdgpu_ttm_adev(mem->bo->tbo.bdev);
|
||||
r = drm_gem_prime_handle_to_fd(&bo_adev->ddev, bo_adev->kfd.client.file,
|
||||
mem->gem_handle,
|
||||
mem->alloc_flags & KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE ?
|
||||
DRM_RDWR : 0);
|
||||
if (IS_ERR(ret))
|
||||
return PTR_ERR(ret);
|
||||
mem->dmabuf = ret;
|
||||
DRM_RDWR : 0, &fd);
|
||||
if (r)
|
||||
return r;
|
||||
dmabuf = dma_buf_get(fd);
|
||||
close_fd(fd);
|
||||
if (WARN_ON_ONCE(IS_ERR(dmabuf)))
|
||||
return PTR_ERR(dmabuf);
|
||||
mem->dmabuf = dmabuf;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -1778,6 +1788,9 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
|
||||
pr_debug("Failed to allow vma node access. ret %d\n", ret);
|
||||
goto err_node_allow;
|
||||
}
|
||||
ret = drm_gem_handle_create(adev->kfd.client.file, gobj, &(*mem)->gem_handle);
|
||||
if (ret)
|
||||
goto err_gem_handle_create;
|
||||
bo = gem_to_amdgpu_bo(gobj);
|
||||
if (bo_type == ttm_bo_type_sg) {
|
||||
bo->tbo.sg = sg;
|
||||
@@ -1829,6 +1842,8 @@ allocate_init_user_pages_failed:
|
||||
err_pin_bo:
|
||||
err_validate_bo:
|
||||
remove_kgd_mem_from_kfd_bo_list(*mem, avm->process_info);
|
||||
drm_gem_handle_delete(adev->kfd.client.file, (*mem)->gem_handle);
|
||||
err_gem_handle_create:
|
||||
drm_vma_node_revoke(&gobj->vma_node, drm_priv);
|
||||
err_node_allow:
|
||||
/* Don't unreserve system mem limit twice */
|
||||
@@ -1941,8 +1956,12 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
|
||||
|
||||
/* Free the BO*/
|
||||
drm_vma_node_revoke(&mem->bo->tbo.base.vma_node, drm_priv);
|
||||
if (mem->dmabuf)
|
||||
if (!mem->is_imported)
|
||||
drm_gem_handle_delete(adev->kfd.client.file, mem->gem_handle);
|
||||
if (mem->dmabuf) {
|
||||
dma_buf_put(mem->dmabuf);
|
||||
mem->dmabuf = NULL;
|
||||
}
|
||||
mutex_destroy(&mem->lock);
|
||||
|
||||
/* If this releases the last reference, it will end up calling
|
||||
|
||||
Reference in New Issue
Block a user