diff options
Diffstat (limited to 'meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0546-drm-amdgpu-use-only-one-reservation-object-for-each-.patch')
-rw-r--r-- | meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0546-drm-amdgpu-use-only-one-reservation-object-for-each-.patch | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0546-drm-amdgpu-use-only-one-reservation-object-for-each-.patch b/meta-amdfalconx86/recipes-kernel/linux/linux-yocto/0546-drm-amdgpu-use-only-one-reservation-object-for-each-.patch new file mode 100644 index 00000000..eb30c746 --- /dev/null +++ b/meta-amdfalconx86/recipes-kernel/linux/linux-yocto/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 + |