diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/5416-drm-amdgpu-use-a-single-linked-list-for-amdgpu_vm_bo.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.14.71/5416-drm-amdgpu-use-a-single-linked-list-for-amdgpu_vm_bo.patch | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/5416-drm-amdgpu-use-a-single-linked-list-for-amdgpu_vm_bo.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/5416-drm-amdgpu-use-a-single-linked-list-for-amdgpu_vm_bo.patch new file mode 100644 index 00000000..d90d00ad --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/5416-drm-amdgpu-use-a-single-linked-list-for-amdgpu_vm_bo.patch @@ -0,0 +1,201 @@ +From deae27f7a94dbd5009815a3bc62443b3d5db9233 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com> +Date: Mon, 10 Sep 2018 20:02:46 +0200 +Subject: [PATCH 5416/5725] drm/amdgpu: use a single linked list for + amdgpu_vm_bo_base +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Instead of the double linked list. Gets the size of amdgpu_vm_pt down to +64 bytes again. + +We could even reduce it down to 32 bytes, but that would require some +rather extreme hacks. + +Signed-off-by: Christian König <christian.koenig@amd.com> +Reviewed-by: Chunming Zhou <david1.zhou@amd.com> +Acked-by: Felix Kuehling <Felix.Kuehling@amd.com> +Signed-off-by: Raveendra Talabattula <raveendra.talabattula@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 4 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 4 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 72 +++++++++++++++++------------- + drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 2 +- + 4 files changed, 47 insertions(+), 35 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +index b2947f4..77f0d2e 100755 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +@@ -469,10 +469,10 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev, + + bo = kzalloc(sizeof(struct amdgpu_bo), GFP_KERNEL); + if (bo == NULL) +- return -ENOMEM; ++ return -ENOMEM; + drm_gem_private_object_init(adev->ddev, &bo->gem_base, size); + INIT_LIST_HEAD(&bo->shadow_list); +- INIT_LIST_HEAD(&bo->va); ++ bo->vm_bo = NULL; + bo->preferred_domains = bp->preferred_domain ? bp->preferred_domain : + bp->domain; + bo->allowed_domains = bo->preferred_domains; +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h +index 3674265..9a5c138 100755 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h +@@ -89,8 +89,8 @@ struct amdgpu_bo { + void *metadata; + u32 metadata_size; + unsigned prime_shared_count; +- /* list of all virtual address to which this bo is associated to */ +- struct list_head va; ++ /* per VM structure for page tables and with virtual addresses */ ++ struct amdgpu_vm_bo_base *vm_bo; + /* Constant after initialization */ + struct drm_gem_object gem_base; + struct amdgpu_bo *parent; +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +index d359284..1e09cf3 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +@@ -273,33 +273,34 @@ static void amdgpu_vm_bo_done(struct amdgpu_vm_bo_base *vm_bo) + * + */ + static void amdgpu_vm_bo_base_init(struct amdgpu_vm_bo_base *base, +- struct amdgpu_vm *vm, +- struct amdgpu_bo *bo) ++ struct amdgpu_vm *vm, ++ struct amdgpu_bo *bo) + { +- base->vm = vm; +- base->bo = bo; +- INIT_LIST_HEAD(&base->bo_list); +- INIT_LIST_HEAD(&base->vm_status); ++ base->vm = vm; ++ base->bo = bo; ++ base->next = NULL; ++ INIT_LIST_HEAD(&base->vm_status); + +- if (!bo) +- return; +- list_add_tail(&base->bo_list, &bo->va); ++ if (!bo) ++ return; ++ base->next = bo->vm_bo; ++ bo->vm_bo = base; + +- if (bo->tbo.type == ttm_bo_type_kernel) +- amdgpu_vm_bo_relocated(base); ++ if (bo->tbo.type == ttm_bo_type_kernel) ++ amdgpu_vm_bo_relocated(base); + +- if (bo->tbo.resv != vm->root.base.bo->tbo.resv) +- return; ++ if (bo->tbo.resv != vm->root.base.bo->tbo.resv) ++ return; + +- if (bo->preferred_domains & +- amdgpu_mem_type_to_domain(bo->tbo.mem.mem_type)) +- return; ++ if (bo->preferred_domains & ++ amdgpu_mem_type_to_domain(bo->tbo.mem.mem_type)) ++ return; + +- /* +- * we checked all the prerequisites, but it looks like this per vm bo +- * is currently evicted. add the bo to the evicted list to make sure it +- * is validated on next vm use to avoid fault. +- * */ ++ /* ++ * we checked all the prerequisites, but it looks like this per vm bo ++ * is currently evicted. add the bo to the evicted list to make sure it ++ * is validated on next vm use to avoid fault. ++ * */ + amdgpu_vm_bo_evicted(base); + } + +@@ -318,7 +319,7 @@ static struct amdgpu_vm_pt *amdgpu_vm_pt_parent(struct amdgpu_vm_pt *pt) + if (!parent) + return NULL; + +- return list_first_entry(&parent->va, struct amdgpu_vm_pt, base.bo_list); ++ return container_of(parent->vm_bo, struct amdgpu_vm_pt, base); + } + + /** +@@ -883,7 +884,7 @@ static void amdgpu_vm_free_pts(struct amdgpu_device *adev, + for_each_amdgpu_vm_pt_dfs_safe(adev, vm, cursor, entry) { + + if (entry->base.bo) { +- list_del(&entry->base.bo_list); ++ entry->base.bo->vm_bo = NULL; + list_del(&entry->base.vm_status); + amdgpu_bo_unref(&entry->base.bo->shadow); + amdgpu_bo_unref(&entry->base.bo); +@@ -1091,12 +1092,13 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job, bool need_ + struct amdgpu_bo_va *amdgpu_vm_bo_find(struct amdgpu_vm *vm, + struct amdgpu_bo *bo) + { +- struct amdgpu_bo_va *bo_va; ++ struct amdgpu_vm_bo_base *base; + +- list_for_each_entry(bo_va, &bo->va, base.bo_list) { +- if (bo_va->base.vm == vm) { +- return bo_va; +- } ++ for (base = bo->vm_bo; base; base = base->next) { ++ if (base->vm != vm) ++ continue; ++ ++ return container_of(base, struct amdgpu_bo_va, base); + } + return NULL; + } +@@ -2649,9 +2651,19 @@ void amdgpu_vm_bo_rmv(struct amdgpu_device *adev, + struct amdgpu_bo_va *bo_va) + { + struct amdgpu_bo_va_mapping *mapping, *next; ++ struct amdgpu_bo *bo = bo_va->base.bo; + struct amdgpu_vm *vm = bo_va->base.vm; ++ struct amdgpu_vm_bo_base **base; + +- list_del(&bo_va->base.bo_list); ++ if (bo) { ++ for (base = &bo_va->base.bo->vm_bo; *base; ++ base = &(*base)->next) { ++ if (*base != &bo_va->base) ++ continue; ++ *base = bo_va->base.next; ++ break; ++ } ++ } + + spin_lock(&vm->moved_lock); + list_del(&bo_va->base.vm_status); +@@ -2693,7 +2705,7 @@ void amdgpu_vm_bo_invalidate(struct amdgpu_device *adev, + if (bo->parent && bo->parent->shadow == bo) + bo = bo->parent; + +- list_for_each_entry(bo_base, &bo->va, bo_list) { ++ for (bo_base = bo->vm_bo; bo_base; bo_base = bo_base->next) { + struct amdgpu_vm *vm = bo_base->vm; + + if (evicted && bo->tbo.resv == vm->root.base.bo->tbo.resv) { +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h +index a869ec8..ff711a4 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h +@@ -132,7 +132,7 @@ struct amdgpu_vm_bo_base { + struct amdgpu_bo *bo; + + /* protected by bo being reserved */ +- struct list_head bo_list; ++ struct amdgpu_vm_bo_base *next; + + /* protected by spinlock */ + struct list_head vm_status; +-- +2.7.4 + |