From: "Chen, Xiaogang" <xiaogang.chen@amd.com>
To: Felix Kuehling <felix.kuehling@amd.com>, amd-gfx@lists.freedesktop.org
Cc: ramesh.errabolu@amd.com, christian.koenig@amd.com
Subject: Re: [PATCH 5/6] drm/amdkfd: Import DMABufs for interop through DRM
Date: Wed, 8 Nov 2023 17:41:10 -0600 [thread overview]
Message-ID: <c3fe6cca-e26c-936d-7bff-71a27c0f6ae8@amd.com> (raw)
In-Reply-To: <297844d3-835c-4785-b2f9-122a1432e474@amd.com>
On 11/8/2023 5:26 PM, Felix Kuehling wrote:
> On 2023-11-08 18:20, Chen, Xiaogang wrote:
>>
>> On 11/7/2023 10:58 AM, Felix Kuehling wrote:
>>> Use drm_gem_prime_fd_to_handle to import DMABufs for interop. This
>>> ensures that a GEM handle is created on import and that obj->dma_buf
>>> will be set and remain set as long as the object is imported into KFD.
>>>
>>> Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
>>> ---
>>> drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 9 ++-
>>> .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 64
>>> +++++++++++++------
>>> drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 15 ++---
>>> 3 files changed, 52 insertions(+), 36 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
>>> index 4caf8cece028..88a0e0734270 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
>>> @@ -318,11 +318,10 @@ int
>>> amdgpu_amdkfd_gpuvm_restore_process_bos(void *process_info,
>>> struct dma_fence **ef);
>>> int amdgpu_amdkfd_gpuvm_get_vm_fault_info(struct amdgpu_device *adev,
>>> struct kfd_vm_fault_info *info);
>>> -int amdgpu_amdkfd_gpuvm_import_dmabuf(struct amdgpu_device *adev,
>>> - struct dma_buf *dmabuf,
>>> - uint64_t va, void *drm_priv,
>>> - struct kgd_mem **mem, uint64_t *size,
>>> - uint64_t *mmap_offset);
>>> +int amdgpu_amdkfd_gpuvm_import_dmabuf_fd(struct amdgpu_device
>>> *adev, int fd,
>>> + uint64_t va, void *drm_priv,
>>> + struct kgd_mem **mem, uint64_t *size,
>>> + uint64_t *mmap_offset);
>>> int amdgpu_amdkfd_gpuvm_export_dmabuf(struct kgd_mem *mem,
>>> struct dma_buf **dmabuf);
>>> void amdgpu_amdkfd_debug_mem_fence(struct amdgpu_device *adev);
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
>>> index 4bb8b5fd7598..1077de8bced2 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
>>> @@ -2006,8 +2006,7 @@ 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->is_imported)
>>> - drm_gem_handle_delete(adev->kfd.client.file, mem->gem_handle);
>>> + drm_gem_handle_delete(adev->kfd.client.file, mem->gem_handle);
>>
>> A minor thing for this patch: I think this is a correction for last
>> patch " Export DMABufs from KFD using GEM handles". mem->gem_handle
>> is created unconditionally at
>> amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu. drm_gem_handle_delete
>> should be put at the lat patch.
>
> This change was intentional. Without this patch, imported DMABufs
> didn't get a GEM handle, so I didn't need to delete one. With this
> patch, I now have a GEM handle for imported BOs, so I delete the GEM
> handle unconditionally.
>
oh, imported mem->gem_handle is generated at
amdgpu_amdkfd_gpuvm_import_dmabuf_fd. Need refresh my memory after a
while. This patch is:
Reviwed-by: Xiaogang.Chen <Xiaogang.Chen@amd.com>
> Regards,
> Felix
>
>
>>
>> Regards
>>
>> Xiaogang
>>
>>> if (mem->dmabuf) {
>>> dma_buf_put(mem->dmabuf);
>>> mem->dmabuf = NULL;
>>> @@ -2363,34 +2362,26 @@ int
>>> amdgpu_amdkfd_gpuvm_get_vm_fault_info(struct amdgpu_device *adev,
>>> return 0;
>>> }
>>> -int amdgpu_amdkfd_gpuvm_import_dmabuf(struct amdgpu_device *adev,
>>> - struct dma_buf *dma_buf,
>>> - uint64_t va, void *drm_priv,
>>> - struct kgd_mem **mem, uint64_t *size,
>>> - uint64_t *mmap_offset)
>>> +static int import_obj_create(struct amdgpu_device *adev,
>>> + struct dma_buf *dma_buf,
>>> + struct drm_gem_object *obj,
>>> + uint64_t va, void *drm_priv,
>>> + struct kgd_mem **mem, uint64_t *size,
>>> + uint64_t *mmap_offset)
>>> {
>>> struct amdgpu_vm *avm = drm_priv_to_vm(drm_priv);
>>> - struct drm_gem_object *obj;
>>> struct amdgpu_bo *bo;
>>> int ret;
>>> - 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 */
>>> - ret = -EINVAL;
>>> - goto err_put_obj;
>>> - }
>>> + return -EINVAL;
>>> *mem = kzalloc(sizeof(struct kgd_mem), GFP_KERNEL);
>>> - if (!*mem) {
>>> - ret = -ENOMEM;
>>> - goto err_put_obj;
>>> - }
>>> + if (!*mem)
>>> + return -ENOMEM;
>>> ret = drm_vma_node_allow(&obj->vma_node, drm_priv);
>>> if (ret)
>>> @@ -2440,8 +2431,41 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct
>>> amdgpu_device *adev,
>>> drm_vma_node_revoke(&obj->vma_node, drm_priv);
>>> err_free_mem:
>>> kfree(*mem);
>>> + return ret;
>>> +}
>>> +
>>> +int amdgpu_amdkfd_gpuvm_import_dmabuf_fd(struct amdgpu_device
>>> *adev, int fd,
>>> + uint64_t va, void *drm_priv,
>>> + struct kgd_mem **mem, uint64_t *size,
>>> + uint64_t *mmap_offset)
>>> +{
>>> + struct drm_gem_object *obj;
>>> + uint32_t handle;
>>> + int ret;
>>> +
>>> + ret = drm_gem_prime_fd_to_handle(&adev->ddev,
>>> adev->kfd.client.file, fd,
>>> + &handle);
>>> + if (ret)
>>> + return ret;
>>> + obj = drm_gem_object_lookup(adev->kfd.client.file, handle);
>>> + if (!obj) {
>>> + ret = -EINVAL;
>>> + goto err_release_handle;
>>> + }
>>> +
>>> + ret = import_obj_create(adev, obj->dma_buf, obj, va, drm_priv,
>>> mem, size,
>>> + mmap_offset);
>>> + if (ret)
>>> + goto err_put_obj;
>>> +
>>> + (*mem)->gem_handle = handle;
>>> +
>>> + return 0;
>>> +
>>> err_put_obj:
>>> drm_gem_object_put(obj);
>>> +err_release_handle:
>>> + drm_gem_handle_delete(adev->kfd.client.file, handle);
>>> return ret;
>>> }
>>> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
>>> b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
>>> index 4417a9863cd0..1a2e9f564b7f 100644
>>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
>>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
>>> @@ -1564,16 +1564,11 @@ static int kfd_ioctl_import_dmabuf(struct
>>> file *filep,
>>> {
>>> struct kfd_ioctl_import_dmabuf_args *args = data;
>>> struct kfd_process_device *pdd;
>>> - struct dma_buf *dmabuf;
>>> int idr_handle;
>>> uint64_t size;
>>> void *mem;
>>> int r;
>>> - dmabuf = dma_buf_get(args->dmabuf_fd);
>>> - if (IS_ERR(dmabuf))
>>> - return PTR_ERR(dmabuf);
>>> -
>>> mutex_lock(&p->mutex);
>>> pdd = kfd_process_device_data_by_id(p, args->gpu_id);
>>> if (!pdd) {
>>> @@ -1587,10 +1582,10 @@ static int kfd_ioctl_import_dmabuf(struct
>>> file *filep,
>>> goto err_unlock;
>>> }
>>> - r = amdgpu_amdkfd_gpuvm_import_dmabuf(pdd->dev->adev, dmabuf,
>>> - args->va_addr, pdd->drm_priv,
>>> - (struct kgd_mem **)&mem, &size,
>>> - NULL);
>>> + r = amdgpu_amdkfd_gpuvm_import_dmabuf_fd(pdd->dev->adev,
>>> args->dmabuf_fd,
>>> + args->va_addr, pdd->drm_priv,
>>> + (struct kgd_mem **)&mem, &size,
>>> + NULL);
>>> if (r)
>>> goto err_unlock;
>>> @@ -1601,7 +1596,6 @@ static int kfd_ioctl_import_dmabuf(struct
>>> file *filep,
>>> }
>>> mutex_unlock(&p->mutex);
>>> - dma_buf_put(dmabuf);
>>> args->handle = MAKE_HANDLE(args->gpu_id, idr_handle);
>>> @@ -1612,7 +1606,6 @@ static int kfd_ioctl_import_dmabuf(struct
>>> file *filep,
>>> pdd->drm_priv, NULL);
>>> err_unlock:
>>> mutex_unlock(&p->mutex);
>>> - dma_buf_put(dmabuf);
>>> return r;
>>> }
next prev parent reply other threads:[~2023-11-08 23:41 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-07 16:58 [PATCH 1/6] drm/amdgpu: Fix possible null pointer dereference Felix Kuehling
2023-11-07 16:58 ` [PATCH 2/6] drm/amdgpu: New VM state for evicted user BOs Felix Kuehling
2023-11-07 22:11 ` Felix Kuehling
2023-11-08 12:28 ` Christian König
2023-11-08 21:23 ` Felix Kuehling
2023-11-09 8:12 ` Christian König
2023-11-14 22:26 ` Felix Kuehling
2023-11-07 16:58 ` [PATCH 3/6] drm/amdgpu: Auto-validate DMABuf imports in compute VMs Felix Kuehling
2023-11-07 20:24 ` Joshi, Mukul
2023-11-07 16:58 ` [PATCH 4/6] drm/amdkfd: Export DMABufs from KFD using GEM handles Felix Kuehling
2023-11-07 19:44 ` Errabolu, Ramesh
2023-11-07 19:56 ` Felix Kuehling
2023-11-08 2:08 ` Errabolu, Ramesh
2023-11-16 21:53 ` Felix Kuehling
2023-11-17 16:30 ` Christian König
2023-11-07 16:58 ` [PATCH 5/6] drm/amdkfd: Import DMABufs for interop through DRM Felix Kuehling
2023-11-08 0:01 ` Errabolu, Ramesh
2023-11-08 23:20 ` Chen, Xiaogang
2023-11-08 23:26 ` Felix Kuehling
2023-11-08 23:41 ` Chen, Xiaogang [this message]
2023-11-09 8:16 ` Christian König
2023-11-07 16:58 ` [PATCH 6/6] drm/amdkfd: Bump KFD ioctl version Felix Kuehling
2023-11-08 12:11 ` [PATCH 1/6] drm/amdgpu: Fix possible null pointer dereference Christian König
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=c3fe6cca-e26c-936d-7bff-71a27c0f6ae8@amd.com \
--to=xiaogang.chen@amd.com \
--cc=amd-gfx@lists.freedesktop.org \
--cc=christian.koenig@amd.com \
--cc=felix.kuehling@amd.com \
--cc=ramesh.errabolu@amd.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox