diff options
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.patch | 234 |
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 + |