Mesa (main): radv/winsys: stop using reference counting for virtual BOs

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Dec 15 11:05:56 UTC 2021


Module: Mesa
Branch: main
Commit: a6ca0a8c52d7ff1ac0d3aca3cc727c6dc571f94a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=a6ca0a8c52d7ff1ac0d3aca3cc727c6dc571f94a

Author: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Date:   Mon Dec  6 18:43:27 2021 +0100

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 <samuel.pitoiset at gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14116>

---

 src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c | 17 +----------------
 src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.h |  1 -
 2 files changed, 1 insertion(+), 17 deletions(-)

diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c
index feaa4a4a305..79e1265b063 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 0beaa7ef727..3095723f28b 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 */



More information about the mesa-commit mailing list