From: Samuel Pitoiset Date: Mon, 6 Dec 2021 17:43:27 +0000 (+0100) Subject: radv/winsys: stop using reference counting for virtual BOs X-Git-Tag: upstream/22.3.5~14765 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a6ca0a8c52d7ff1ac0d3aca3cc727c6dc571f94a;p=platform%2Fupstream%2Fmesa.git radv/winsys: stop using reference counting for virtual BOs This shouldn't be necessary because applications have to manage resources and memory themselves. This also prevented memory to be freed if an application doesn't unbind a sparse memory object and free it, which is legal as long as the resource isn't used afterwards. This was introduced to unmap the sparse mappings when destroying a virtual BO, but now that the driver uses OP_CLEAR it's no longer needed. Signed-off-by: Samuel Pitoiset Reviewed-by: Bas Nieuwenhuizen Part-of: --- diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c index feaa4a4..79e1265 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c @@ -74,8 +74,7 @@ radv_amdgpu_winsys_virtual_map(struct radv_amdgpu_winsys *ws, struct radv_amdgpu if (!range->bo) { internal_flags |= AMDGPU_VM_PAGE_PRT; - } else - p_atomic_inc(&range->bo->ref_count); + } int r = radv_amdgpu_bo_va_op(ws, range->bo ? range->bo->bo : NULL, range->bo_offset, range->size, range->offset + bo->base.va, 0, internal_flags, AMDGPU_VA_OP_MAP); @@ -100,9 +99,6 @@ radv_amdgpu_winsys_virtual_unmap(struct radv_amdgpu_winsys *ws, struct radv_amdg range->offset + bo->base.va, 0, internal_flags, AMDGPU_VA_OP_UNMAP); if (r) abort(); - - if (range->bo) - ws->base.buffer_destroy(&ws->base, (struct radeon_winsys_bo *)range->bo); } static int @@ -352,9 +348,6 @@ radv_amdgpu_winsys_bo_destroy(struct radeon_winsys *_ws, struct radeon_winsys_bo struct radv_amdgpu_winsys *ws = radv_amdgpu_winsys(_ws); struct radv_amdgpu_winsys_bo *bo = radv_amdgpu_winsys_bo(_bo); - if (p_atomic_dec_return(&bo->ref_count)) - return; - radv_amdgpu_log_bo(ws, bo, true); if (bo->is_virtual) { @@ -366,11 +359,6 @@ radv_amdgpu_winsys_bo_destroy(struct radeon_winsys *_ws, struct radeon_winsys_bo fprintf(stderr, "amdgpu: Failed to clear a PRT VA region (%d).\n", r); } - for (uint32_t i = 0; i < bo->range_count; ++i) { - const struct radv_amdgpu_map_range *range = bo->ranges + i; - if (range->bo) - ws->base.buffer_destroy(&ws->base, (struct radeon_winsys_bo *)range->bo); - } free(bo->bos); free(bo->ranges); } else { @@ -441,7 +429,6 @@ radv_amdgpu_winsys_bo_create(struct radeon_winsys *_ws, uint64_t size, unsigned bo->va_handle = va_handle; bo->size = size; bo->is_virtual = !!(flags & RADEON_FLAG_VIRTUAL); - bo->ref_count = 1; if (flags & RADEON_FLAG_VIRTUAL) { ranges = realloc(NULL, sizeof(struct radv_amdgpu_map_range)); @@ -669,7 +656,6 @@ radv_amdgpu_winsys_bo_from_ptr(struct radeon_winsys *_ws, void *pointer, uint64_ bo->base.va = va; bo->va_handle = va_handle; bo->size = size; - bo->ref_count = 1; bo->bo = buf_handle; bo->base.initial_domain = RADEON_DOMAIN_GTT; bo->base.use_global_list = false; @@ -764,7 +750,6 @@ radv_amdgpu_winsys_bo_from_fd(struct radeon_winsys *_ws, int fd, unsigned priori bo->size = result.alloc_size; bo->is_shared = true; bo->priority = priority; - bo->ref_count = 1; r = amdgpu_bo_export(result.buf_handle, amdgpu_bo_handle_type_kms, &bo->bo_handle); assert(!r); diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.h b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.h index 0beaa7e..3095723 100644 --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.h +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.h @@ -44,7 +44,6 @@ struct radv_amdgpu_winsys_bo { uint64_t size; bool is_virtual; uint8_t priority; - int ref_count; union { /* physical bo */