diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0860-drm-amdgpu-add-bo_va-cleared-flag-again-v2.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0860-drm-amdgpu-add-bo_va-cleared-flag-again-v2.patch | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0860-drm-amdgpu-add-bo_va-cleared-flag-again-v2.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0860-drm-amdgpu-add-bo_va-cleared-flag-again-v2.patch new file mode 100644 index 00000000..bb042685 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/0860-drm-amdgpu-add-bo_va-cleared-flag-again-v2.patch @@ -0,0 +1,125 @@ +From af46c355877c915701a133212d886b140f68d1c9 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com> +Date: Tue, 15 Aug 2017 17:08:12 +0200 +Subject: [PATCH 0860/4131] drm/amdgpu: add bo_va cleared flag again v2 +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +We changed this to use an extra list a while back, but for the next +series I need a separate flag again. + +v2: reorder to avoid unlocked list access + +Signed-off-by: Christian König <christian.koenig@amd.com> +Reviewed-by: Chunming Zhou <david1.zhou@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 3 +++ + drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 35 +++++++++++------------------- + drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 3 --- + 3 files changed, 16 insertions(+), 25 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h +index 18d1932..84667c6 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h +@@ -55,6 +55,9 @@ struct amdgpu_bo_va { + /* mappings for this bo_va */ + struct list_head invalids; + struct list_head valids; ++ ++ /* If the mappings are cleared or filled */ ++ bool cleared; + }; + + struct amdgpu_bo { +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +index 58745e1..fe20ef9 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +@@ -1809,11 +1809,8 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev, + bo_va->base.moved = false; + list_splice_init(&bo_va->valids, &bo_va->invalids); + +- } else { +- spin_lock(&vm->status_lock); +- if (!list_empty(&bo_va->base.vm_status)) +- list_splice_init(&bo_va->valids, &bo_va->invalids); +- spin_unlock(&vm->status_lock); ++ } else if (bo_va->cleared != clear) { ++ list_splice_init(&bo_va->valids, &bo_va->invalids); + } + + list_for_each_entry(mapping, &bo_va->invalids, list) { +@@ -1824,25 +1821,22 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev, + return r; + } + +- if (trace_amdgpu_vm_bo_mapping_enabled()) { +- list_for_each_entry(mapping, &bo_va->valids, list) +- trace_amdgpu_vm_bo_mapping(mapping); +- +- list_for_each_entry(mapping, &bo_va->invalids, list) +- trace_amdgpu_vm_bo_mapping(mapping); ++ if (vm->use_cpu_for_update) { ++ /* Flush HDP */ ++ mb(); ++ amdgpu_gart_flush_gpu_tlb(adev, 0); + } + + spin_lock(&vm->status_lock); +- list_splice_init(&bo_va->invalids, &bo_va->valids); + list_del_init(&bo_va->base.vm_status); +- if (clear) +- list_add(&bo_va->base.vm_status, &vm->cleared); + spin_unlock(&vm->status_lock); + +- if (vm->use_cpu_for_update) { +- /* Flush HDP */ +- mb(); +- amdgpu_gart_flush_gpu_tlb(adev, 0); ++ list_splice_init(&bo_va->invalids, &bo_va->valids); ++ bo_va->cleared = clear; ++ ++ if (trace_amdgpu_vm_bo_mapping_enabled()) { ++ list_for_each_entry(mapping, &bo_va->valids, list) ++ trace_amdgpu_vm_bo_mapping(mapping); + } + + return 0; +@@ -2444,9 +2438,7 @@ void amdgpu_vm_bo_invalidate(struct amdgpu_device *adev, + list_for_each_entry(bo_base, &bo->va, bo_list) { + bo_base->moved = true; + spin_lock(&bo_base->vm->status_lock); +- if (list_empty(&bo_base->vm_status)) +- list_add(&bo_base->vm_status, +- &bo_base->vm->moved); ++ list_move(&bo_base->vm_status, &bo_base->vm->moved); + spin_unlock(&bo_base->vm->status_lock); + } + } +@@ -2533,7 +2525,6 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm, + vm->reserved_vmid[i] = NULL; + spin_lock_init(&vm->status_lock); + INIT_LIST_HEAD(&vm->moved); +- INIT_LIST_HEAD(&vm->cleared); + INIT_LIST_HEAD(&vm->freed); + + /* create scheduler entity for page table updates */ +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h +index 37aef84..3e1290c 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h +@@ -129,9 +129,6 @@ struct amdgpu_vm { + /* BOs moved, but not yet updated in the PT */ + struct list_head moved; + +- /* BOs cleared in the PT because of a move */ +- struct list_head cleared; +- + /* BO mappings freed, but not yet updated in the PT */ + struct list_head freed; + +-- +2.7.4 + |