aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1421-drm-amdgpu-Create-symmetry-between-map_bo_to_gpuvm-a.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1421-drm-amdgpu-Create-symmetry-between-map_bo_to_gpuvm-a.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1421-drm-amdgpu-Create-symmetry-between-map_bo_to_gpuvm-a.patch205
1 files changed, 205 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1421-drm-amdgpu-Create-symmetry-between-map_bo_to_gpuvm-a.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1421-drm-amdgpu-Create-symmetry-between-map_bo_to_gpuvm-a.patch
new file mode 100644
index 00000000..f381d30a
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1421-drm-amdgpu-Create-symmetry-between-map_bo_to_gpuvm-a.patch
@@ -0,0 +1,205 @@
+From 0f6374b004d7ce2479da3daff0cd448716bd3f85 Mon Sep 17 00:00:00 2001
+From: Yong Zhao <yong.zhao@amd.com>
+Date: Wed, 27 Apr 2016 20:18:31 -0400
+Subject: [PATCH 1421/4131] drm/amdgpu: Create symmetry between map_bo_to_gpuvm
+ and unmap_bo_from_gpuvm
+
+1. Move all unpin operations into unmap_bo_from_gpuvm
+2. Move reservation of BOs and page tables out of unmap_bo_from_gpuvm
+This way the BO and page tables are reserved only once for all unmap and
+unpin operations, instead of reserving and unreserving individual BO and
+page table for each unmap and unpin.
+
+Change-Id: I64158cdd8eded0ec546ecab9ca3d78820660fdea
+Signed-off-by: Yong Zhao <yong.zhao@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 76 ++++++++++--------------
+ 1 file changed, 31 insertions(+), 45 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+index c9f7af6..023ef5e 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+@@ -478,6 +478,7 @@ static int reserve_bo_and_vms(struct kgd_mem *mem,
+ ctx->n_vms++;
+ }
+ }
++
+ if (ctx->n_vms == 0)
+ ctx->vm_pd = NULL;
+ else {
+@@ -1015,32 +1016,10 @@ int amdgpu_amdkfd_gpuvm_get_vm_fault_info(struct kgd_dev *kgd,
+ }
+
+ static int unmap_bo_from_gpuvm(struct amdgpu_device *adev,
++ struct amdgpu_bo *bo,
+ struct amdgpu_bo_va *bo_va)
+ {
+- struct amdgpu_vm *vm;
+- int ret;
+- struct ttm_validate_buffer tv;
+- struct ww_acquire_ctx ticket;
+- struct amdgpu_bo_list_entry vm_pd;
+- struct list_head list, duplicates;
+-
+- INIT_LIST_HEAD(&list);
+- INIT_LIST_HEAD(&duplicates);
+-
+- vm = bo_va->vm;
+- tv.bo = &bo_va->bo->tbo;
+- tv.shared = true;
+- list_add(&tv.head, &list);
+-
+- amdgpu_vm_get_pd_bo(vm, &list, &vm_pd);
+-
+- ret = ttm_eu_reserve_buffers(&ticket, &list, false, &duplicates);
+- if (ret) {
+- pr_err("amdkfd: Failed to reserve buffers in ttm\n");
+- return ret;
+- }
+-
+- amdgpu_vm_get_pt_bos(vm, &duplicates);
++ struct amdgpu_vm *vm = bo_va->vm;
+
+ /*
+ * The previously "released" BOs are really released and their VAs are
+@@ -1054,7 +1033,12 @@ static int unmap_bo_from_gpuvm(struct amdgpu_device *adev,
+
+ amdgpu_vm_clear_invalids(adev, vm, NULL);
+
+- ttm_eu_backoff_reservation(&ticket, &list);
++ /* Unpin the PD directory*/
++ unpin_bo(bo_va->vm->page_directory, false);
++ /* Unpin PTs */
++ unpin_pts(bo_va, bo_va->vm, false);
++ /* Unpin BO*/
++ unpin_bo(bo, false);
+
+ return 0;
+ }
+@@ -1079,6 +1063,7 @@ int amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu(
+ struct amdgpu_device *adev;
+ unsigned mapped_before;
+ int ret = 0;
++ struct bo_vm_reservation_context ctx;
+
+ BUG_ON(kgd == NULL);
+ BUG_ON(mem == NULL);
+@@ -1103,6 +1088,10 @@ int amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu(
+ }
+ mapped_before = mem->data2.mapped_to_gpu_memory;
+
++ ret = reserve_bo_and_vms(mem, vm, true, &ctx);
++ if (unlikely(ret != 0))
++ goto out;
++
+ list_for_each_entry(entry, &mem->data2.bo_va_list, bo_list) {
+ if (entry->kgd_dev == kgd &&
+ entry->bo_va->vm == vm &&
+@@ -1114,7 +1103,7 @@ int amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu(
+ ret = kgd2kfd->resume_mm(adev->kfd,
+ current->mm);
+ if (ret != 0)
+- goto out;
++ goto unreserve_out;
+ entry->is_mapped = false;
+ mem->data2.mapped_to_gpu_memory--;
+ continue;
+@@ -1124,28 +1113,22 @@ int amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu(
+ mem->data2.va,
+ mem->data2.bo->tbo.mem.size);
+
+- ret = unmap_bo_from_gpuvm(adev, entry->bo_va);
++ ret = unmap_bo_from_gpuvm(adev, mem->data2.bo,
++ entry->bo_va);
+ if (ret == 0) {
+ entry->is_mapped = false;
+ } else {
+ pr_err("amdgpu: failed unmap va 0x%llx\n",
+ mem->data2.va);
+- goto out;
++ goto unreserve_out;
+ }
+
+- /* Unpin the PD directory*/
+- unpin_bo(entry->bo_va->vm->page_directory, true);
+- /* Unpin PTs */
+- unpin_pts(entry->bo_va, entry->bo_va->vm, true);
+-
+- /* Unpin BO*/
+- unpin_bo(mem->data2.bo, true);
+-
+ mem->data2.mapped_to_gpu_memory--;
+ pr_debug("amdgpu: DEC mapping count %d\n",
+ mem->data2.mapped_to_gpu_memory);
+ }
+ }
++
+ if (mapped_before == mem->data2.mapped_to_gpu_memory) {
+ pr_debug("BO size %lu bytes at va 0x%llx is not mapped on GPU %x:%x.%x\n",
+ mem->data2.bo->tbo.mem.size, mem->data2.va,
+@@ -1154,6 +1137,8 @@ int amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu(
+ ret = -EINVAL;
+ }
+
++unreserve_out:
++ unreserve_bo_and_vms(&ctx, true);
+ out:
+ mutex_unlock(&mem->data2.lock);
+ return ret;
+@@ -1426,6 +1411,7 @@ int amdgpu_amdkfd_gpuvm_evict_mem(struct kgd_mem *mem, struct mm_struct *mm)
+ struct kfd_bo_va_list *entry;
+ unsigned n_evicted;
+ int r = 0;
++ struct bo_vm_reservation_context ctx;
+
+ pr_debug("Evicting buffer %p\n", mem);
+
+@@ -1438,6 +1424,11 @@ int amdgpu_amdkfd_gpuvm_evict_mem(struct kgd_mem *mem, struct mm_struct *mm)
+ * number of evicted mappings so we can roll back if something
+ * goes wrong. */
+ n_evicted = 0;
++
++ r = reserve_bo_and_vms(mem, NULL, true, &ctx);
++ if (unlikely(r != 0))
++ return r;
++
+ list_for_each_entry(entry, &mem->data2.bo_va_list, bo_list) {
+ struct amdgpu_device *adev;
+
+@@ -1452,7 +1443,7 @@ int amdgpu_amdkfd_gpuvm_evict_mem(struct kgd_mem *mem, struct mm_struct *mm)
+ goto fail;
+ }
+
+- r = unmap_bo_from_gpuvm(adev, entry->bo_va);
++ r = unmap_bo_from_gpuvm(adev, mem->data2.bo, entry->bo_va);
+ if (r != 0) {
+ pr_err("failed unmap va 0x%llx\n",
+ mem->data2.va);
+@@ -1460,20 +1451,15 @@ int amdgpu_amdkfd_gpuvm_evict_mem(struct kgd_mem *mem, struct mm_struct *mm)
+ goto fail;
+ }
+
+- /* Unpin the PD directory*/
+- unpin_bo(entry->bo_va->vm->page_directory, true);
+- /* Unpin PTs */
+- unpin_pts(entry->bo_va, entry->bo_va->vm, true);
+-
+- /* Unpin BO*/
+- unpin_bo(mem->data2.bo, true);
+-
+ n_evicted++;
+ }
+
++ unreserve_bo_and_vms(&ctx, true);
++
+ return 0;
+
+ fail:
++ unreserve_bo_and_vms(&ctx, true);
+ /* To avoid hangs and keep state consistent, roll back partial
+ * eviction by restoring queues and marking mappings as
+ * unmapped. Access to now unmapped buffers will fault. */
+--
+2.7.4
+