aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3309-drm-amdkfd-Unsupport-NULL-device-array-on-GPU-map.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3309-drm-amdkfd-Unsupport-NULL-device-array-on-GPU-map.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3309-drm-amdkfd-Unsupport-NULL-device-array-on-GPU-map.patch234
1 files changed, 234 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3309-drm-amdkfd-Unsupport-NULL-device-array-on-GPU-map.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3309-drm-amdkfd-Unsupport-NULL-device-array-on-GPU-map.patch
new file mode 100644
index 00000000..c2671a2a
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3309-drm-amdkfd-Unsupport-NULL-device-array-on-GPU-map.patch
@@ -0,0 +1,234 @@
+From ad658ca6f651b6edaadcb3c651a29009e96daf03 Mon Sep 17 00:00:00 2001
+From: Oak Zeng <Oak.Zeng@amd.com>
+Date: Mon, 22 Jan 2018 16:23:06 -0500
+Subject: [PATCH 3309/4131] drm/amdkfd: Unsupport NULL device array on GPU map
+
+Previously, zero-sized device id array is supported
+on mapping memory to GPU. Unsupport this and now Thunk
+or application is required to pass a none-zero-sized
+arrary on mapping memory to GPU.
+
+Change-Id: I6f6f1c524b46e253e10252fda77bd159ecbc3743
+Signed-off-by: Oak Zeng <Oak.Zeng@amd.com>
+---
+ drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 150 ++++++++++++++-----------------
+ 1 file changed, 68 insertions(+), 82 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
+index 7fd26ec..59ab2e4 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
+@@ -1291,25 +1291,27 @@ static int kfd_ioctl_map_memory_to_gpu(struct file *filep,
+ if (!dev)
+ return -EINVAL;
+
+- if (args->device_ids_array_size > 0 &&
+- (args->device_ids_array_size < sizeof(uint32_t))) {
++ if (args->device_ids_array_size == 0) {
++ pr_debug("Device ID array size is 0\n");
++ return -EINVAL;
++ }
++
++ if (args->device_ids_array_size % sizeof(uint32_t)) {
+ pr_debug("Node IDs array size %u\n",
+ args->device_ids_array_size);
+ return -EFAULT;
+ }
+
+- if (args->device_ids_array_size > 0) {
+- devices_arr = kmalloc(args->device_ids_array_size, GFP_KERNEL);
+- if (!devices_arr)
+- return -ENOMEM;
++ devices_arr = kmalloc(args->device_ids_array_size, GFP_KERNEL);
++ if (!devices_arr)
++ return -ENOMEM;
+
+- err = copy_from_user(devices_arr,
+- (void __user *)args->device_ids_array_ptr,
+- args->device_ids_array_size);
+- if (err != 0) {
+- err = -EFAULT;
+- goto copy_from_user_failed;
+- }
++ err = copy_from_user(devices_arr,
++ (void __user *)args->device_ids_array_ptr,
++ args->device_ids_array_size);
++ if (err != 0) {
++ err = -EFAULT;
++ goto copy_from_user_failed;
+ }
+
+ mutex_lock(&p->mutex);
+@@ -1327,35 +1329,26 @@ static int kfd_ioctl_map_memory_to_gpu(struct file *filep,
+ goto get_mem_obj_from_handle_failed;
+ }
+
+- if (args->device_ids_array_size > 0) {
+- num_dev = args->device_ids_array_size / sizeof(uint32_t);
+- for (i = 0 ; i < num_dev; i++) {
+- peer = kfd_device_by_id(devices_arr[i]);
+- if (!peer) {
+- pr_debug("Getting device by id failed for 0x%x\n",
+- devices_arr[i]);
+- err = -EFAULT;
+- goto get_mem_obj_from_handle_failed;
+- }
++ num_dev = args->device_ids_array_size / sizeof(uint32_t);
++ for (i = 0 ; i < num_dev; i++) {
++ peer = kfd_device_by_id(devices_arr[i]);
++ if (!peer) {
++ pr_debug("Getting device by id failed for 0x%x\n",
++ devices_arr[i]);
++ err = -EFAULT;
++ goto get_mem_obj_from_handle_failed;
++ }
+
+- peer_pdd = kfd_bind_process_to_device(peer, p);
+- if (!peer_pdd) {
+- err = -EFAULT;
+- goto get_mem_obj_from_handle_failed;
+- }
+- err = peer->kfd2kgd->map_memory_to_gpu(
+- peer->kgd, (struct kgd_mem *)mem, peer_pdd->vm);
+- if (err != 0) {
+- pr_err("Failed to map to gpu %d, num_dev=%d\n",
+- i, num_dev);
+- goto map_memory_to_gpu_failed;
+- }
++ peer_pdd = kfd_bind_process_to_device(peer, p);
++ if (!peer_pdd) {
++ err = -EFAULT;
++ goto get_mem_obj_from_handle_failed;
+ }
+- } else {
+- err = dev->kfd2kgd->map_memory_to_gpu(
+- dev->kgd, (struct kgd_mem *)mem, pdd->vm);
++ err = peer->kfd2kgd->map_memory_to_gpu(
++ peer->kgd, (struct kgd_mem *)mem, peer_pdd->vm);
+ if (err != 0) {
+- pr_err("Failed to map\n");
++ pr_err("Failed to map to gpu %d, num_dev=%d\n",
++ i, num_dev);
+ goto map_memory_to_gpu_failed;
+ }
+ }
+@@ -1369,19 +1362,14 @@ static int kfd_ioctl_map_memory_to_gpu(struct file *filep,
+ }
+
+ /* Flush TLBs after waiting for the page table updates to complete */
+- if (args->device_ids_array_size > 0) {
+- for (i = 0; i < num_dev; i++) {
+- peer = kfd_device_by_id(devices_arr[i]);
+- if (WARN_ON_ONCE(!peer))
+- continue;
+- kfd_flush_tlb(peer, p);
+- }
+- } else {
+- kfd_flush_tlb(dev, p);
++ for (i = 0; i < num_dev; i++) {
++ peer = kfd_device_by_id(devices_arr[i]);
++ if (WARN_ON_ONCE(!peer))
++ continue;
++ kfd_flush_tlb(peer, p);
+ }
+
+- if (args->device_ids_array_size > 0 && devices_arr)
+- kfree(devices_arr);
++ kfree(devices_arr);
+
+ return err;
+
+@@ -1391,8 +1379,7 @@ static int kfd_ioctl_map_memory_to_gpu(struct file *filep,
+ mutex_unlock(&p->mutex);
+ copy_from_user_failed:
+ sync_memory_failed:
+- if (args->device_ids_array_size > 0 && devices_arr)
+- kfree(devices_arr);
++ kfree(devices_arr);
+
+ return err;
+ }
+@@ -1427,25 +1414,27 @@ static int kfd_ioctl_unmap_memory_from_gpu(struct file *filep,
+ if (!dev)
+ return -EINVAL;
+
+- if (args->device_ids_array_size > 0 &&
+- (args->device_ids_array_size < sizeof(uint32_t))) {
++ if (args->device_ids_array_size == 0) {
++ pr_debug("Device ID array size is 0\n");
++ return -EINVAL;
++ }
++
++ if (args->device_ids_array_size % sizeof(uint32_t)) {
+ pr_debug("Node IDs array size %u\n",
+ args->device_ids_array_size);
+ return -EFAULT;
+ }
+
+- if (args->device_ids_array_size > 0) {
+- devices_arr = kmalloc(args->device_ids_array_size, GFP_KERNEL);
+- if (!devices_arr)
+- return -ENOMEM;
++ devices_arr = kmalloc(args->device_ids_array_size, GFP_KERNEL);
++ if (!devices_arr)
++ return -ENOMEM;
+
+- err = copy_from_user(devices_arr,
+- (void __user *)args->device_ids_array_ptr,
+- args->device_ids_array_size);
+- if (err != 0) {
+- err = -EFAULT;
+- goto copy_from_user_failed;
+- }
++ err = copy_from_user(devices_arr,
++ (void __user *)args->device_ids_array_ptr,
++ args->device_ids_array_size);
++ if (err != 0) {
++ err = -EFAULT;
++ goto copy_from_user_failed;
+ }
+
+ mutex_lock(&p->mutex);
+@@ -1464,25 +1453,22 @@ static int kfd_ioctl_unmap_memory_from_gpu(struct file *filep,
+ goto get_mem_obj_from_handle_failed;
+ }
+
+- if (args->device_ids_array_size > 0) {
+- num_dev = args->device_ids_array_size / sizeof(uint32_t);
+- for (i = 0 ; i < num_dev; i++) {
+- peer = kfd_device_by_id(devices_arr[i]);
+- if (!peer) {
+- err = -EFAULT;
+- goto get_mem_obj_from_handle_failed;
+- }
++ num_dev = args->device_ids_array_size / sizeof(uint32_t);
++ for (i = 0 ; i < num_dev; i++) {
++ peer = kfd_device_by_id(devices_arr[i]);
++ if (!peer) {
++ err = -EFAULT;
++ goto get_mem_obj_from_handle_failed;
++ }
+
+- peer_pdd = kfd_get_process_device_data(peer, p);
+- if (!peer_pdd) {
+- err = -EFAULT;
+- goto get_mem_obj_from_handle_failed;
+- }
+- kfd_unmap_memory_from_gpu(mem, peer_pdd);
++ peer_pdd = kfd_get_process_device_data(peer, p);
++ if (!peer_pdd) {
++ err = -EFAULT;
++ goto get_mem_obj_from_handle_failed;
+ }
+- kfree(devices_arr);
+- } else
+- kfd_unmap_memory_from_gpu(mem, pdd);
++ kfd_unmap_memory_from_gpu(mem, peer_pdd);
++ }
++ kfree(devices_arr);
+
+ mutex_unlock(&p->mutex);
+
+--
+2.7.4
+