diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2863-drm-amdkfd-Address-inconsistent-returns-locks.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2863-drm-amdkfd-Address-inconsistent-returns-locks.patch | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2863-drm-amdkfd-Address-inconsistent-returns-locks.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2863-drm-amdkfd-Address-inconsistent-returns-locks.patch new file mode 100644 index 00000000..d2c0a5a2 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2863-drm-amdkfd-Address-inconsistent-returns-locks.patch @@ -0,0 +1,87 @@ +From bf84c7908bd86f26a03d565f3d2e4f77e85a67ad Mon Sep 17 00:00:00 2001 +From: Kent Russell <kent.russell@amd.com> +Date: Tue, 21 Nov 2017 08:44:08 -0500 +Subject: [PATCH 2863/4131] drm/amdkfd: Address inconsistent returns/locks + +This can hopefully resolve potential deadlocks in +unlikely situations + +Change-Id: Ic971f5b5dd86c55d98c16635cf15d65b2df44e26 +Signed-off-by: Kent Russell <kent.russell@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 12 ++++++------ + drivers/gpu/drm/amd/amdkfd/kfd_events.c | 7 +++++-- + 2 files changed, 11 insertions(+), 8 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +index ab5c7ea..1bff21b 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +@@ -1252,7 +1252,8 @@ int amdgpu_amdkfd_gpuvm_map_memory_to_gpu( + + if (!bo) { + pr_err("Invalid BO when mapping memory to GPU\n"); +- return -EINVAL; ++ ret = -EINVAL; ++ goto out; + } + + domain = mem->domain; +@@ -1265,7 +1266,7 @@ int amdgpu_amdkfd_gpuvm_map_memory_to_gpu( + + ret = reserve_bo_and_vm(mem, vm, &ctx); + if (unlikely(ret != 0)) +- goto bo_reserve_failed; ++ goto out; + + /* Userptr can be marked as "not invalid", but not actually be + * validated yet (still in the system domain). In that case +@@ -1332,9 +1333,7 @@ int amdgpu_amdkfd_gpuvm_map_memory_to_gpu( + true); + ret = unreserve_bo_and_vms(&ctx, false, false); + +- mutex_unlock(&mem->process_info->lock); +- mutex_unlock(&mem->lock); +- return ret; ++ goto out; + + map_bo_to_gpuvm_failed: + if (bo_va_entry_aql) +@@ -1344,7 +1343,8 @@ int amdgpu_amdkfd_gpuvm_map_memory_to_gpu( + remove_bo_from_vm(adev, bo_va_entry, bo_size); + add_bo_to_vm_failed: + unreserve_bo_and_vms(&ctx, false, false); +-bo_reserve_failed: ++ ++out: + mutex_unlock(&mem->process_info->lock); + mutex_unlock(&mem->lock); + return ret; +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_events.c b/drivers/gpu/drm/amd/amdkfd/kfd_events.c +index 1c53601..86afd01 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_events.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_events.c +@@ -333,8 +333,10 @@ int kfd_event_create(struct file *devkfd, struct kfd_process *p, + if (kern_addr && !p->signal_page) { + p->signal_page = allocate_signal_page_dgpu(p, kern_addr, + *event_page_offset); +- if (!p->signal_page) +- return -ENOMEM; ++ if (!p->signal_page) { ++ ret = -ENOMEM; ++ goto out; ++ } + } + + *event_page_offset = 0; +@@ -361,6 +363,7 @@ int kfd_event_create(struct file *devkfd, struct kfd_process *p, + kfree(ev); + } + ++out: + mutex_unlock(&p->event_mutex); + + return ret; +-- +2.7.4 + |