From 1394e415b750d8fc6484cea8371650af24b7bc79 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Sat, 30 Oct 2021 15:28:53 -0500 Subject: [PATCH] anv/allocator: Use anv_device_release_bo in anv_block_pool_finish This is left-over from the days where we didn't use BO pointers and had them embedded and we didn't have a nice allocation API. Now that block pools get their memory via anv_device_alloc_bo(), they really should be using anv_device_release_bo() to tear it down. This is equivalent in this case because anv_device_release_bo() does the following: 1. Decrements refcount. The pool holds the only reference so it will proceed onto the clean-up steps 2. Unmaps it, if needed. This is the same as the tear-down code today except anv_device_release_bo() will avoid doing an unmap if it's been created via userptr. The current code probably unmaps the userptr which is wrong but pretty harmless since it happens on a tear-down path. 3. Unmaps the CCS range from the AUX-TT, if any. There is none, so this is a no-op. 4. Frees the VA range if it's not pinned and doesn't have a fixed VA assignment. These BOs always either have a fixed VA range (softpin) or aren't pinned (relocations). 5. Closes the GEM handle. Same as the current code. In short, anything created using the BO API should probably be destroyed that way. We were getting away with hand-rolling it because this is a simple case. Why did we do it this way? It dates back to before the more formlized BO cache and BO API in ANV. Reviewed-by: Paulo Zanoni Part-of: --- src/intel/vulkan/anv_allocator.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/intel/vulkan/anv_allocator.c b/src/intel/vulkan/anv_allocator.c index 62fa92386b3..02987e210c3 100644 --- a/src/intel/vulkan/anv_allocator.c +++ b/src/intel/vulkan/anv_allocator.c @@ -439,9 +439,8 @@ void anv_block_pool_finish(struct anv_block_pool *pool) { anv_block_pool_foreach_bo(bo, pool) { - if (bo->map) - anv_gem_munmap(pool->device, bo->map, bo->size); - anv_gem_close(pool->device, bo->gem_handle); + assert(bo->refcount == 1); + anv_device_release_bo(pool->device, bo); } struct anv_mmap_cleanup *cleanup;