diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/1562-drm-amdgpu-kfd2kgd-Use-dma_buf-instead-of-dma_buf_fd.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/1562-drm-amdgpu-kfd2kgd-Use-dma_buf-instead-of-dma_buf_fd.patch | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/1562-drm-amdgpu-kfd2kgd-Use-dma_buf-instead-of-dma_buf_fd.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/1562-drm-amdgpu-kfd2kgd-Use-dma_buf-instead-of-dma_buf_fd.patch new file mode 100644 index 00000000..8b809a51 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/1562-drm-amdgpu-kfd2kgd-Use-dma_buf-instead-of-dma_buf_fd.patch @@ -0,0 +1,255 @@ +From e058a5c433aa68690a25a5cb27a7fa551c566e56 Mon Sep 17 00:00:00 2001 +From: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com> +Date: Tue, 29 Nov 2016 17:45:17 -0500 +Subject: [PATCH 1562/4131] drm/amdgpu: kfd2kgd: Use dma_buf instead of + dma_buf_fd + +For kfd2kgd import_dmabuf and export_dmabuf interfaces use struct +dma_buf* instead of dma_buf_fd. This avoids taking unncessary references +to dma_buf_fd. + +Change-Id: Ib7718e0bf0f7950ca8157d4353c32ff6baad86fa +Signed-off-by: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 6 ++-- + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 40 +++++++++--------------- + drivers/gpu/drm/amd/amdkfd/kfd_ipc.c | 28 ++++++++++------- + drivers/gpu/drm/amd/include/kgd_kfd_interface.h | 9 +++--- + 4 files changed, 40 insertions(+), 43 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h +index 6003b77..a9f877a 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h +@@ -192,12 +192,14 @@ int amdgpu_amdkfd_gpuvm_pin_get_sg_table(struct kgd_dev *kgd, + uint64_t size, struct sg_table **ret_sg); + void amdgpu_amdkfd_gpuvm_unpin_put_sg_table( + struct kgd_mem *mem, struct sg_table *sg); +-int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd, int dma_buf_fd, ++int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd, ++ struct dma_buf *dmabuf, + uint64_t va, void *vm, + struct kgd_mem **mem, uint64_t *size, + uint64_t *mmap_offset); + int amdgpu_amdkfd_gpuvm_export_dmabuf(struct kgd_dev *kgd, void *vm, +- struct kgd_mem *mem, int *dmabuf_fd); ++ struct kgd_mem *mem, ++ struct dma_buf **dmabuf); + int amdgpu_amdkfd_gpuvm_evict_mem(struct kgd_mem *mem, struct mm_struct *mm); + int amdgpu_amdkfd_gpuvm_restore_mem(struct kgd_mem *mem, struct mm_struct *mm); + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +index a5d84d7..ec63c82 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +@@ -1789,36 +1789,35 @@ void amdgpu_amdkfd_gpuvm_unpin_put_sg_table( + unpin_bo_wo_map(mem); + } + +-int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd, int dma_buf_fd, ++int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd, ++ struct dma_buf *dma_buf, + uint64_t va, void *vm, + struct kgd_mem **mem, uint64_t *size, + uint64_t *mmap_offset) + { + struct amdgpu_device *adev = (struct amdgpu_device *)kgd; +- struct dma_buf *dma_buf; + struct drm_gem_object *obj; + struct amdgpu_bo *bo; +- int r = 0; + struct amdkfd_vm *kfd_vm = (struct amdkfd_vm *)vm; + +- dma_buf = dma_buf_get(dma_buf_fd); +- if (IS_ERR(dma_buf)) +- return PTR_ERR(dma_buf); +- + if (dma_buf->ops != &drm_gem_prime_dmabuf_ops) + /* Can't handle non-graphics buffers */ +- goto out_put; ++ return -EINVAL; + + obj = dma_buf->priv; + if (obj->dev->dev_private != adev) + /* Can't handle buffers from other devices */ +- goto out_put; ++ return -EINVAL; + + bo = gem_to_amdgpu_bo(obj); + if (!(bo->prefered_domains & (AMDGPU_GEM_DOMAIN_VRAM | + AMDGPU_GEM_DOMAIN_GTT))) + /* Only VRAM and GTT BOs are supported */ +- goto out_put; ++ return -EINVAL; ++ ++ *mem = kzalloc(sizeof(struct kgd_mem), GFP_KERNEL); ++ if (*mem == NULL) ++ return -ENOMEM; + + if (size) + *size = amdgpu_bo_size(bo); +@@ -1826,12 +1825,6 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd, int dma_buf_fd, + if (mmap_offset) + *mmap_offset = amdgpu_bo_mmap_offset(bo); + +- *mem = kzalloc(sizeof(struct kgd_mem), GFP_KERNEL); +- if (*mem == NULL) { +- r = -ENOMEM; +- goto out_put; +- } +- + INIT_LIST_HEAD(&(*mem)->bo_va_list); + mutex_init(&(*mem)->lock); + (*mem)->pte_flags = AMDGPU_PTE_READABLE | AMDGPU_PTE_VALID +@@ -1844,20 +1837,18 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd, int dma_buf_fd, + (*mem)->mapped_to_gpu_memory = 0; + add_kgd_mem_to_kfd_bo_list(*mem, kfd_vm); + +-out_put: +- dma_buf_put(dma_buf); +- return r; ++ return 0; + } + + int amdgpu_amdkfd_gpuvm_export_dmabuf(struct kgd_dev *kgd, void *vm, +- struct kgd_mem *mem, int *dmabuf_fd) ++ struct kgd_mem *mem, ++ struct dma_buf **dmabuf) + { +- struct dma_buf *dmabuf; + struct amdgpu_device *adev = NULL; + struct amdgpu_bo *bo = NULL; + struct drm_gem_object *gobj = NULL; + +- if (!dmabuf_fd || !kgd || !vm || !mem) ++ if (!dmabuf || !kgd || !vm || !mem) + return -EINVAL; + + adev = get_amdgpu_device(kgd); +@@ -1869,10 +1860,7 @@ int amdgpu_amdkfd_gpuvm_export_dmabuf(struct kgd_dev *kgd, void *vm, + return -EINVAL; + } + +- dmabuf = amdgpu_gem_prime_export(adev->ddev, gobj, 0); +- *dmabuf_fd = dma_buf_fd(dmabuf, 0); +- +- pr_debug("Exported: %d\n", *dmabuf_fd); ++ *dmabuf = amdgpu_gem_prime_export(adev->ddev, gobj, 0); + return 0; + } + +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_ipc.c b/drivers/gpu/drm/amd/amdkfd/kfd_ipc.c +index edd2d43..5391f8a 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_ipc.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_ipc.c +@@ -185,7 +185,7 @@ int kfd_ipc_init(void) + + static int kfd_import_dmabuf_create_kfd_bo(struct kfd_dev *dev, + struct kfd_process *p, +- uint32_t gpu_id, int dmabuf_fd, ++ uint32_t gpu_id, struct dma_buf *dmabuf, + uint64_t va_addr, uint64_t *handle, + uint64_t *mmap_offset, + struct kfd_ipc_obj *ipc_obj) +@@ -210,7 +210,7 @@ static int kfd_import_dmabuf_create_kfd_bo(struct kfd_dev *dev, + if (IS_ERR(pdd) < 0) + return PTR_ERR(pdd); + +- r = dev->kfd2kgd->import_dmabuf(dev->kgd, dmabuf_fd, ++ r = dev->kfd2kgd->import_dmabuf(dev->kgd, dmabuf, + va_addr, pdd->vm, + (struct kgd_mem **)&mem, &size, + mmap_offset); +@@ -243,9 +243,17 @@ int kfd_ipc_import_dmabuf(struct kfd_dev *dev, + uint64_t va_addr, uint64_t *handle, + uint64_t *mmap_offset) + { +- return kfd_import_dmabuf_create_kfd_bo(dev, p, gpu_id, dmabuf_fd, +- va_addr, handle, mmap_offset, +- NULL); ++ int r; ++ struct dma_buf *dmabuf = dma_buf_get(dmabuf_fd); ++ ++ if (dmabuf == NULL) ++ return -EINVAL; ++ ++ r = kfd_import_dmabuf_create_kfd_bo(dev, p, gpu_id, dmabuf, ++ va_addr, handle, mmap_offset, ++ NULL); ++ dma_buf_put(dmabuf); ++ return r; + } + + int kfd_ipc_import_handle(struct kfd_dev *dev, struct kfd_process *p, +@@ -254,7 +262,6 @@ int kfd_ipc_import_handle(struct kfd_dev *dev, struct kfd_process *p, + uint64_t *mmap_offset) + { + int r; +- int dmabuf_fd; + struct kfd_ipc_obj *found; + + found = assoc_array_find(&ipc_handles, +@@ -266,8 +273,7 @@ int kfd_ipc_import_handle(struct kfd_dev *dev, struct kfd_process *p, + + pr_debug("ipc: found ipc_dma_buf: %p\n", found->data); + +- dmabuf_fd = dma_buf_fd(found->data, 0); +- r = kfd_import_dmabuf_create_kfd_bo(dev, p, gpu_id, dmabuf_fd, ++ r = kfd_import_dmabuf_create_kfd_bo(dev, p, gpu_id, found->data, + va_addr, handle, mmap_offset, + found); + if (r) +@@ -286,7 +292,7 @@ int kfd_ipc_export_as_handle(struct kfd_dev *dev, struct kfd_process *p, + struct kfd_process_device *pdd = NULL; + struct kfd_ipc_obj *obj; + struct kfd_bo *kfd_bo = NULL; +- int dmabuf_fd; ++ struct dma_buf *dmabuf; + int r; + + if (!dev || !ipc_handle) +@@ -317,11 +323,11 @@ int kfd_ipc_export_as_handle(struct kfd_dev *dev, struct kfd_process *p, + + r = dev->kfd2kgd->export_dmabuf(dev->kgd, pdd->vm, + (struct kgd_mem *)kfd_bo->mem, +- &dmabuf_fd); ++ &dmabuf); + if (r) + goto err; + +- r = ipc_store_insert(dma_buf_get(dmabuf_fd), ipc_handle, &obj); ++ r = ipc_store_insert(dmabuf, ipc_handle, &obj); + if (r) + goto err; + +diff --git a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h +index a655b37..a57dbb1 100644 +--- a/drivers/gpu/drm/amd/include/kgd_kfd_interface.h ++++ b/drivers/gpu/drm/amd/include/kgd_kfd_interface.h +@@ -31,6 +31,7 @@ + #include <linux/types.h> + #include <linux/bitmap.h> + #include <linux/fence.h> ++#include <linux/dma-buf.h> + + struct pci_dev; + +@@ -355,11 +356,11 @@ struct kfd2kgd_calls { + struct kgd_dev **dma_buf_kgd, uint64_t *bo_size, + void *metadata_buffer, size_t buffer_size, + uint32_t *metadata_size, uint32_t *flags); +- int (*import_dmabuf)(struct kgd_dev *kgd, int dma_buf_fd, uint64_t va, +- void *vm, struct kgd_mem **mem, uint64_t *size, +- uint64_t *mmap_offset); ++ int (*import_dmabuf)(struct kgd_dev *kgd, struct dma_buf *dmabuf, ++ uint64_t va, void *vm, struct kgd_mem **mem, ++ uint64_t *size, uint64_t *mmap_offset); + int (*export_dmabuf)(struct kgd_dev *kgd, void *vm, struct kgd_mem *mem, +- int *dma_buf_fd); ++ struct dma_buf **dmabuf); + + int (*get_vm_fault_info)(struct kgd_dev *kgd, + struct kfd_vm_fault_info *info); +-- +2.7.4 + |