Skip to content

Commit 1819200

Browse files
fxkamdalexdeucher
authored andcommitted
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>
1 parent 4e95669 commit 1819200

File tree

4 files changed

+44
-9
lines changed

4 files changed

+44
-9
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ void amdgpu_amdkfd_device_init(struct amdgpu_device *adev)
142142
{
143143
int i;
144144
int last_valid_bit;
145+
int ret;
145146

146147
amdgpu_amdkfd_gpuvm_init_mem_limits();
147148

@@ -160,6 +161,12 @@ void amdgpu_amdkfd_device_init(struct amdgpu_device *adev)
160161
.enable_mes = adev->enable_mes,
161162
};
162163

164+
ret = drm_client_init(&adev->ddev, &adev->kfd.client, "kfd", NULL);
165+
if (ret) {
166+
dev_err(adev->dev, "Failed to init DRM client: %d\n", ret);
167+
return;
168+
}
169+
163170
/* this is going to have a few of the MSBs set that we need to
164171
* clear
165172
*/
@@ -198,6 +205,10 @@ void amdgpu_amdkfd_device_init(struct amdgpu_device *adev)
198205

199206
adev->kfd.init_complete = kgd2kfd_device_init(adev->kfd.dev,
200207
&gpu_resources);
208+
if (adev->kfd.init_complete)
209+
drm_client_register(&adev->kfd.client);
210+
else
211+
drm_client_release(&adev->kfd.client);
201212

202213
amdgpu_amdkfd_total_mem_size += adev->gmc.real_vram_size;
203214

drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include <linux/mmu_notifier.h>
3434
#include <linux/memremap.h>
3535
#include <kgd_kfd_interface.h>
36+
#include <drm/drm_client.h>
3637
#include "amdgpu_sync.h"
3738
#include "amdgpu_vm.h"
3839
#include "amdgpu_xcp.h"
@@ -83,6 +84,7 @@ struct kgd_mem {
8384

8485
struct amdgpu_sync sync;
8586

87+
uint32_t gem_handle;
8688
bool aql_queue;
8789
bool is_imported;
8890
};
@@ -105,6 +107,9 @@ struct amdgpu_kfd_dev {
105107

106108
/* HMM page migration MEMORY_DEVICE_PRIVATE mapping */
107109
struct dev_pagemap pgmap;
110+
111+
/* Client for KFD BO GEM handle allocations */
112+
struct drm_client_dev client;
108113
};
109114

110115
enum kgd_engine_type {

drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include <linux/pagemap.h>
2626
#include <linux/sched/mm.h>
2727
#include <linux/sched/task.h>
28+
#include <linux/fdtable.h>
2829
#include <drm/ttm/ttm_tt.h>
2930

3031
#include <drm/drm_exec.h>
@@ -806,13 +807,22 @@ kfd_mem_dmaunmap_attachment(struct kgd_mem *mem,
806807
static int kfd_mem_export_dmabuf(struct kgd_mem *mem)
807808
{
808809
if (!mem->dmabuf) {
809-
struct dma_buf *ret = amdgpu_gem_prime_export(
810-
&mem->bo->tbo.base,
810+
struct amdgpu_device *bo_adev;
811+
struct dma_buf *dmabuf;
812+
int r, fd;
813+
814+
bo_adev = amdgpu_ttm_adev(mem->bo->tbo.bdev);
815+
r = drm_gem_prime_handle_to_fd(&bo_adev->ddev, bo_adev->kfd.client.file,
816+
mem->gem_handle,
811817
mem->alloc_flags & KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE ?
812-
DRM_RDWR : 0);
813-
if (IS_ERR(ret))
814-
return PTR_ERR(ret);
815-
mem->dmabuf = ret;
818+
DRM_RDWR : 0, &fd);
819+
if (r)
820+
return r;
821+
dmabuf = dma_buf_get(fd);
822+
close_fd(fd);
823+
if (WARN_ON_ONCE(IS_ERR(dmabuf)))
824+
return PTR_ERR(dmabuf);
825+
mem->dmabuf = dmabuf;
816826
}
817827

818828
return 0;
@@ -1778,6 +1788,9 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
17781788
pr_debug("Failed to allow vma node access. ret %d\n", ret);
17791789
goto err_node_allow;
17801790
}
1791+
ret = drm_gem_handle_create(adev->kfd.client.file, gobj, &(*mem)->gem_handle);
1792+
if (ret)
1793+
goto err_gem_handle_create;
17811794
bo = gem_to_amdgpu_bo(gobj);
17821795
if (bo_type == ttm_bo_type_sg) {
17831796
bo->tbo.sg = sg;
@@ -1829,6 +1842,8 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
18291842
err_pin_bo:
18301843
err_validate_bo:
18311844
remove_kgd_mem_from_kfd_bo_list(*mem, avm->process_info);
1845+
drm_gem_handle_delete(adev->kfd.client.file, (*mem)->gem_handle);
1846+
err_gem_handle_create:
18321847
drm_vma_node_revoke(&gobj->vma_node, drm_priv);
18331848
err_node_allow:
18341849
/* Don't unreserve system mem limit twice */
@@ -1941,8 +1956,12 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
19411956

19421957
/* Free the BO*/
19431958
drm_vma_node_revoke(&mem->bo->tbo.base.vma_node, drm_priv);
1944-
if (mem->dmabuf)
1959+
if (!mem->is_imported)
1960+
drm_gem_handle_delete(adev->kfd.client.file, mem->gem_handle);
1961+
if (mem->dmabuf) {
19451962
dma_buf_put(mem->dmabuf);
1963+
mem->dmabuf = NULL;
1964+
}
19461965
mutex_destroy(&mem->lock);
19471966

19481967
/* If this releases the last reference, it will end up calling

drivers/gpu/drm/amd/amdkfd/kfd_chardev.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1855,8 +1855,8 @@ static uint32_t get_process_num_bos(struct kfd_process *p)
18551855
return num_of_bos;
18561856
}
18571857

1858-
static int criu_get_prime_handle(struct kgd_mem *mem, int flags,
1859-
u32 *shared_fd)
1858+
static int criu_get_prime_handle(struct kgd_mem *mem,
1859+
int flags, u32 *shared_fd)
18601860
{
18611861
struct dma_buf *dmabuf;
18621862
int ret;

0 commit comments

Comments
 (0)