diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0359-drm-amdgpu-use-dfs-iterator-to-free-PDs-PTs.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0359-drm-amdgpu-use-dfs-iterator-to-free-PDs-PTs.patch | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0359-drm-amdgpu-use-dfs-iterator-to-free-PDs-PTs.patch b/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0359-drm-amdgpu-use-dfs-iterator-to-free-PDs-PTs.patch new file mode 100644 index 00000000..d12cd5f3 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0359-drm-amdgpu-use-dfs-iterator-to-free-PDs-PTs.patch @@ -0,0 +1,110 @@ +From 9b3c415e9de67ccd30a278fdfe7f7d0835f4fa00 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com> +Date: Thu, 6 Sep 2018 15:35:13 +0200 +Subject: [PATCH 0359/2940] drm/amdgpu: use dfs iterator to free PDs/PTs +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Allows us to free all PDs/PTs without recursion. + +Change-Id: I4d40cc769b5bf29e619fe2886ee785a62e72f961 +Signed-off-by: Christian König <christian.koenig@amd.com> +Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com> +Reviewed-by: Junwei Zhang <Jerry.Zhang@amd.com> +Reviewed-by: Huang Rui <ray.huang@amd.com> +Signed-off-by: Kalyan Alle <kalyan.alle@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 62 +++++++++++++------------- + 1 file changed, 30 insertions(+), 32 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +index c0b70c0c0743..ae55630a0326 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +@@ -932,6 +932,35 @@ int amdgpu_vm_alloc_pts(struct amdgpu_device *adev, + return r; + } + ++/** ++ * amdgpu_vm_free_pts - free PD/PT levels ++ * ++ * @adev: amdgpu device structure ++ * @parent: PD/PT starting level to free ++ * @level: level of parent structure ++ * ++ * Free the page directory or page table level and all sub levels. ++ */ ++static void amdgpu_vm_free_pts(struct amdgpu_device *adev, ++ struct amdgpu_vm *vm) ++{ ++ struct amdgpu_vm_pt_cursor cursor; ++ struct amdgpu_vm_pt *entry; ++ ++ for_each_amdgpu_vm_pt_dfs_safe(adev, vm, cursor, entry) { ++ ++ if (entry->base.bo) { ++ list_del(&entry->base.bo_list); ++ list_del(&entry->base.vm_status); ++ amdgpu_bo_unref(&entry->base.bo->shadow); ++ amdgpu_bo_unref(&entry->base.bo); ++ } ++ kvfree(entry->entries); ++ } ++ ++ BUG_ON(vm->root.base.bo); ++} ++ + /** + * amdgpu_vm_check_compute_bug - check whether asic has compute vm bug + * +@@ -3115,36 +3144,6 @@ int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm) + return r; + } + +-/** +- * amdgpu_vm_free_levels - free PD/PT levels +- * +- * @adev: amdgpu device structure +- * @parent: PD/PT starting level to free +- * @level: level of parent structure +- * +- * Free the page directory or page table level and all sub levels. +- */ +-static void amdgpu_vm_free_levels(struct amdgpu_device *adev, +- struct amdgpu_vm_pt *parent, +- unsigned level) +-{ +- unsigned i, num_entries = amdgpu_vm_num_entries(adev, level); +- +- if (parent->base.bo) { +- list_del(&parent->base.bo_list); +- list_del(&parent->base.vm_status); +- amdgpu_bo_unref(&parent->base.bo->shadow); +- amdgpu_bo_unref(&parent->base.bo); +- } +- +- if (parent->entries) +- for (i = 0; i < num_entries; i++) +- amdgpu_vm_free_levels(adev, &parent->entries[i], +- level + 1); +- +- kvfree(parent->entries); +-} +- + /** + * amdgpu_vm_fini - tear down a vm instance + * +@@ -3205,8 +3204,7 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm) + if (r) { + dev_err(adev->dev, "Leaking page tables because BO reservation failed\n"); + } else { +- amdgpu_vm_free_levels(adev, &vm->root, +- adev->vm_manager.root_level); ++ amdgpu_vm_free_pts(adev, vm); + amdgpu_bo_unreserve(root); + } + amdgpu_bo_unref(&root); +-- +2.17.1 + |