aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0546-drm-amdgpu-use-only-one-reservation-object-for-each-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0546-drm-amdgpu-use-only-one-reservation-object-for-each-.patch')
-rw-r--r--common/recipes-kernel/linux/files/0546-drm-amdgpu-use-only-one-reservation-object-for-each-.patch121
1 files changed, 121 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0546-drm-amdgpu-use-only-one-reservation-object-for-each-.patch b/common/recipes-kernel/linux/files/0546-drm-amdgpu-use-only-one-reservation-object-for-each-.patch
new file mode 100644
index 00000000..eb30c746
--- /dev/null
+++ b/common/recipes-kernel/linux/files/0546-drm-amdgpu-use-only-one-reservation-object-for-each-.patch
@@ -0,0 +1,121 @@
+From bf60efd353f68e5dec1a177b5cbe4da07c819569 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Fri, 4 Sep 2015 10:47:56 +0200
+Subject: [PATCH 0546/1050] drm/amdgpu: use only one reservation object for
+ each VM v2
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Reduces the locking and fencing overhead.
+
+v2: add comment why we need the duplicates list in the GEM op.
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+Reviewed-by: Jammy Zhou <Jammy.Zhou@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 6 ++++--
+ drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 33 +++++----------------------------
+ 2 files changed, 9 insertions(+), 30 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
+index b75c3b2..2f39fea 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
+@@ -455,11 +455,12 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev,
+ struct ttm_validate_buffer tv, *entry;
+ struct amdgpu_bo_list_entry *vm_bos;
+ struct ww_acquire_ctx ticket;
+- struct list_head list;
++ struct list_head list, duplicates;
+ unsigned domain;
+ int r;
+
+ INIT_LIST_HEAD(&list);
++ INIT_LIST_HEAD(&duplicates);
+
+ tv.bo = &bo_va->bo->tbo;
+ tv.shared = true;
+@@ -469,7 +470,8 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev,
+ if (!vm_bos)
+ return;
+
+- r = ttm_eu_reserve_buffers(&ticket, &list, true, NULL);
++ /* Provide duplicates to avoid -EALREADY */
++ r = ttm_eu_reserve_buffers(&ticket, &list, true, &duplicates);
+ if (r)
+ goto error_free;
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+index 8927dc6..d30fbec 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+@@ -686,31 +686,6 @@ static int amdgpu_vm_update_ptes(struct amdgpu_device *adev,
+ }
+
+ /**
+- * amdgpu_vm_fence_pts - fence page tables after an update
+- *
+- * @vm: requested vm
+- * @start: start of GPU address range
+- * @end: end of GPU address range
+- * @fence: fence to use
+- *
+- * Fence the page tables in the range @start - @end (cayman+).
+- *
+- * Global and local mutex must be locked!
+- */
+-static void amdgpu_vm_fence_pts(struct amdgpu_vm *vm,
+- uint64_t start, uint64_t end,
+- struct fence *fence)
+-{
+- unsigned i;
+-
+- start >>= amdgpu_vm_block_size;
+- end >>= amdgpu_vm_block_size;
+-
+- for (i = start; i <= end; ++i)
+- amdgpu_bo_fence(vm->page_tables[i].bo, fence, true);
+-}
+-
+-/**
+ * amdgpu_vm_bo_update_mapping - update a mapping in the vm page table
+ *
+ * @adev: amdgpu_device pointer
+@@ -813,8 +788,7 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,
+ if (r)
+ goto error_free;
+
+- amdgpu_vm_fence_pts(vm, mapping->it.start,
+- mapping->it.last + 1, f);
++ amdgpu_bo_fence(vm->page_directory, f, true);
+ if (fence) {
+ fence_put(*fence);
+ *fence = fence_get(f);
+@@ -1089,6 +1063,7 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev,
+
+ /* walk over the address space and allocate the page tables */
+ for (pt_idx = saddr; pt_idx <= eaddr; ++pt_idx) {
++ struct reservation_object *resv = vm->page_directory->tbo.resv;
+ struct amdgpu_bo *pt;
+
+ if (vm->page_tables[pt_idx].bo)
+@@ -1097,11 +1072,13 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev,
+ /* drop mutex to allocate and clear page table */
+ mutex_unlock(&vm->mutex);
+
++ ww_mutex_lock(&resv->lock, NULL);
+ r = amdgpu_bo_create(adev, AMDGPU_VM_PTE_COUNT * 8,
+ AMDGPU_GPU_PAGE_SIZE, true,
+ AMDGPU_GEM_DOMAIN_VRAM,
+ AMDGPU_GEM_CREATE_NO_CPU_ACCESS,
+- NULL, NULL, &pt);
++ NULL, resv, &pt);
++ ww_mutex_unlock(&resv->lock);
+ if (r)
+ goto error_free;
+
+--
+1.9.1
+