diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0756-drm-amdgpu-add-lock-for-interval-tree-in-vm.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0756-drm-amdgpu-add-lock-for-interval-tree-in-vm.patch | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0756-drm-amdgpu-add-lock-for-interval-tree-in-vm.patch b/common/recipes-kernel/linux/files/0756-drm-amdgpu-add-lock-for-interval-tree-in-vm.patch new file mode 100644 index 00000000..d8055263 --- /dev/null +++ b/common/recipes-kernel/linux/files/0756-drm-amdgpu-add-lock-for-interval-tree-in-vm.patch @@ -0,0 +1,111 @@ +From fe237ed7efec8ac147a4572fdf81173a7f8ddda7 Mon Sep 17 00:00:00 2001 +From: Chunming Zhou <David1.Zhou@amd.com> +Date: Fri, 13 Nov 2015 13:32:01 +0800 +Subject: [PATCH 0756/1050] drm/amdgpu: add lock for interval tree in vm +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Change-Id: I62b892a22af37b32e6b4aefca80a25cf45426ed2 +Signed-off-by: Chunming Zhou <David1.Zhou@amd.com> +Reviewed-by: Christian König <christian.koenig@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 ++ + drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 15 +++++++++++++-- + 2 files changed, 15 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +index 8455136..bcda624 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +@@ -957,6 +957,8 @@ struct amdgpu_vm { + + /* for id and flush management per ring */ + struct amdgpu_vm_id ids[AMDGPU_MAX_RINGS]; ++ /* for interval tree */ ++ spinlock_t it_lock; + }; + + struct amdgpu_vm_manager { +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +index 0bdbb24..0513f3f 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +@@ -1028,7 +1028,9 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev, + saddr /= AMDGPU_GPU_PAGE_SIZE; + eaddr /= AMDGPU_GPU_PAGE_SIZE; + ++ spin_lock(&vm->it_lock); + it = interval_tree_iter_first(&vm->va, saddr, eaddr - 1); ++ spin_unlock(&vm->it_lock); + if (it) { + struct amdgpu_bo_va_mapping *tmp; + tmp = container_of(it, struct amdgpu_bo_va_mapping, it); +@@ -1055,7 +1057,9 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev, + mapping->flags = flags; + + list_add(&mapping->list, &bo_va->invalids); ++ spin_lock(&vm->it_lock); + interval_tree_insert(&mapping->it, &vm->va); ++ spin_unlock(&vm->it_lock); + trace_amdgpu_vm_bo_map(bo_va, mapping); + + /* Make sure the page tables are allocated */ +@@ -1101,7 +1105,9 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev, + + error_free: + list_del(&mapping->list); ++ spin_lock(&vm->it_lock); + interval_tree_remove(&mapping->it, &vm->va); ++ spin_unlock(&vm->it_lock); + trace_amdgpu_vm_bo_unmap(bo_va, mapping); + kfree(mapping); + +@@ -1151,7 +1157,9 @@ int amdgpu_vm_bo_unmap(struct amdgpu_device *adev, + } + + list_del(&mapping->list); ++ spin_lock(&vm->it_lock); + interval_tree_remove(&mapping->it, &vm->va); ++ spin_unlock(&vm->it_lock); + trace_amdgpu_vm_bo_unmap(bo_va, mapping); + + if (valid) +@@ -1187,13 +1195,17 @@ void amdgpu_vm_bo_rmv(struct amdgpu_device *adev, + + list_for_each_entry_safe(mapping, next, &bo_va->valids, list) { + list_del(&mapping->list); ++ spin_lock(&vm->it_lock); + interval_tree_remove(&mapping->it, &vm->va); ++ spin_unlock(&vm->it_lock); + trace_amdgpu_vm_bo_unmap(bo_va, mapping); + list_add(&mapping->list, &vm->freed); + } + list_for_each_entry_safe(mapping, next, &bo_va->invalids, list) { + list_del(&mapping->list); ++ spin_lock(&vm->it_lock); + interval_tree_remove(&mapping->it, &vm->va); ++ spin_unlock(&vm->it_lock); + kfree(mapping); + } + +@@ -1248,7 +1260,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm) + INIT_LIST_HEAD(&vm->invalidated); + INIT_LIST_HEAD(&vm->cleared); + INIT_LIST_HEAD(&vm->freed); +- ++ spin_lock_init(&vm->it_lock); + pd_size = amdgpu_vm_directory_size(adev); + pd_entries = amdgpu_vm_num_pdes(adev); + +@@ -1312,7 +1324,6 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm) + + amdgpu_bo_unref(&vm->page_directory); + fence_put(vm->page_directory_fence); +- + for (i = 0; i < AMDGPU_MAX_RINGS; ++i) { + unsigned id = vm->ids[i].id; + +-- +1.9.1 + |