From 3653085b453792a387bf89f9125b37fd6b8d835c Mon Sep 17 00:00:00 2001 From: Caterina Shablia Date: Wed, 18 Jun 2025 18:18:51 +0000 Subject: [PATCH] panvk: add panvk_as_alloc and panvk_as_free helpers In panvk we often need to allocate and free address ranges in the address space represented by panvk_device::as::heap. In most situations, panvk_device::as::lock has to be held while performing an operation on panvk_device::as::heap, so there are a lot of instances of exactly the same 3 locs locking the as::lock, allocating or freeing a range in as::heap, and unlocking the lock. These helpers are the less verbose replacements for these 3 locs that should be used going forward. Reviewed-by: Boris Brezillon Part-of: --- src/panfrost/vulkan/csf/panvk_vX_gpu_queue.c | 26 +++++--------------- src/panfrost/vulkan/panvk_device.h | 17 +++++++++++++ src/panfrost/vulkan/panvk_device_memory.c | 14 +++-------- src/panfrost/vulkan/panvk_priv_bo.c | 14 +++-------- 4 files changed, 31 insertions(+), 40 deletions(-) diff --git a/src/panfrost/vulkan/csf/panvk_vX_gpu_queue.c b/src/panfrost/vulkan/csf/panvk_vX_gpu_queue.c index 8ad46b6514a..2eef229b33f 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_gpu_queue.c +++ b/src/panfrost/vulkan/csf/panvk_vX_gpu_queue.c @@ -58,9 +58,7 @@ finish_render_desc_ringbuf(struct panvk_gpu_queue *queue) pan_kmod_vm_bind(dev->kmod.vm, PAN_KMOD_VM_OP_MODE_IMMEDIATE, &op, 1); assert(!ret); - simple_mtx_lock(&dev->as.lock); - util_vma_heap_free(&dev->as.heap, ringbuf->addr.dev, ringbuf->size * 2); - simple_mtx_unlock(&dev->as.lock); + panvk_as_free(dev, ringbuf->addr.dev, ringbuf->size * 2); } if (ringbuf->addr.host) { @@ -112,10 +110,7 @@ init_render_desc_ringbuf(struct panvk_gpu_queue *queue) /* We choose the alignment to guarantee that we won't ever cross a 4G * boundary when accessing the mapping. This way we can encode the wraparound * using 32-bit operations. */ - simple_mtx_lock(&dev->as.lock); - dev_addr = - util_vma_heap_alloc(&dev->as.heap, ringbuf->size * 2, ringbuf->size * 2); - simple_mtx_unlock(&dev->as.lock); + dev_addr = panvk_as_alloc(dev, ringbuf->size * 2, ringbuf->size * 2); if (!dev_addr) return panvk_errorf(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY, @@ -151,9 +146,7 @@ init_render_desc_ringbuf(struct panvk_gpu_queue *queue) ret = pan_kmod_vm_bind(dev->kmod.vm, PAN_KMOD_VM_OP_MODE_IMMEDIATE, vm_ops, tracing_enabled ? 1 : ARRAY_SIZE(vm_ops)); if (ret) { - simple_mtx_lock(&dev->as.lock); - util_vma_heap_free(&dev->as.heap, dev_addr, ringbuf->size * 2); - simple_mtx_unlock(&dev->as.lock); + panvk_as_free(dev, dev_addr, ringbuf->size * 2); return panvk_errorf(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY, "Failed to GPU map ringbuf BO"); } @@ -214,10 +207,8 @@ finish_subqueue_tracing(struct panvk_gpu_queue *queue, pan_kmod_vm_bind(dev->kmod.vm, PAN_KMOD_VM_OP_MODE_IMMEDIATE, &op, 1); assert(!ret); - simple_mtx_lock(&dev->as.lock); - util_vma_heap_free(&dev->as.heap, subq->tracebuf.addr.dev, + panvk_as_free(dev, subq->tracebuf.addr.dev, subq->tracebuf.size + pgsize); - simple_mtx_unlock(&dev->as.lock); } if (subq->tracebuf.addr.host) { @@ -275,10 +266,7 @@ init_subqueue_tracing(struct panvk_gpu_queue *queue, /* Add a guard page. */ size_t pgsize = getpagesize(); - simple_mtx_lock(&dev->as.lock); - dev_addr = - util_vma_heap_alloc(&dev->as.heap, subq->tracebuf.size + pgsize, pgsize); - simple_mtx_unlock(&dev->as.lock); + dev_addr = panvk_as_alloc(dev, subq->tracebuf.size + pgsize, pgsize); if (!dev_addr) return panvk_errorf(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY, @@ -301,9 +289,7 @@ init_subqueue_tracing(struct panvk_gpu_queue *queue, int ret = pan_kmod_vm_bind(dev->kmod.vm, PAN_KMOD_VM_OP_MODE_IMMEDIATE, &vm_op, 1); if (ret) { - simple_mtx_lock(&dev->as.lock); - util_vma_heap_free(&dev->as.heap, dev_addr, subq->tracebuf.size + pgsize); - simple_mtx_unlock(&dev->as.lock); + panvk_as_free(dev, dev_addr, subq->tracebuf.size + pgsize); return panvk_errorf(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY, "Failed to GPU map ringbuf BO"); } diff --git a/src/panfrost/vulkan/panvk_device.h b/src/panfrost/vulkan/panvk_device.h index c19200385c2..4224b63a125 100644 --- a/src/panfrost/vulkan/panvk_device.h +++ b/src/panfrost/vulkan/panvk_device.h @@ -133,6 +133,23 @@ panvk_device_adjust_bo_flags(const struct panvk_device *device, return bo_flags; } +static inline uint64_t +panvk_as_alloc(struct panvk_device *device, uint64_t size, uint64_t alignment) +{ + simple_mtx_lock(&device->as.lock); + uint64_t address = util_vma_heap_alloc(&device->as.heap, size, alignment); + simple_mtx_unlock(&device->as.lock); + return address; +} + +static inline void +panvk_as_free(struct panvk_device *device, uint64_t address, uint64_t size) +{ + simple_mtx_lock(&device->as.lock); + util_vma_heap_free(&device->as.heap, address, size); + simple_mtx_unlock(&device->as.lock); +} + #if PAN_ARCH VkResult panvk_per_arch(create_device)(struct panvk_physical_device *physical_device, diff --git a/src/panfrost/vulkan/panvk_device_memory.c b/src/panfrost/vulkan/panvk_device_memory.c index 76fdf3c0d08..ee65b74f0b4 100644 --- a/src/panfrost/vulkan/panvk_device_memory.c +++ b/src/panfrost/vulkan/panvk_device_memory.c @@ -112,11 +112,9 @@ panvk_AllocateMemory(VkDevice _device, }; if (!(device->kmod.vm->flags & PAN_KMOD_VM_FLAG_AUTO_VA)) { - simple_mtx_lock(&device->as.lock); op.va.start = - util_vma_heap_alloc(&device->as.heap, op.va.size, - op.va.size > 0x200000 ? 0x200000 : 0x1000); - simple_mtx_unlock(&device->as.lock); + panvk_as_alloc(device, op.va.size, + op.va.size > 0x200000 ? 0x200000 : 0x1000); if (!op.va.start) { result = panvk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY); goto err_put_bo; @@ -163,9 +161,7 @@ panvk_AllocateMemory(VkDevice _device, err_return_va: if (!(device->kmod.vm->flags & PAN_KMOD_VM_FLAG_AUTO_VA)) { - simple_mtx_lock(&device->as.lock); - util_vma_heap_free(&device->as.heap, op.va.start, op.va.size); - simple_mtx_unlock(&device->as.lock); + panvk_as_free(device, op.va.start, op.va.size); } err_put_bo: @@ -209,9 +205,7 @@ panvk_FreeMemory(VkDevice _device, VkDeviceMemory _mem, assert(!ret); if (!(device->kmod.vm->flags & PAN_KMOD_VM_FLAG_AUTO_VA)) { - simple_mtx_lock(&device->as.lock); - util_vma_heap_free(&device->as.heap, op.va.start, op.va.size); - simple_mtx_unlock(&device->as.lock); + panvk_as_free(device, op.va.start, op.va.size); } pan_kmod_bo_put(mem->bo); diff --git a/src/panfrost/vulkan/panvk_priv_bo.c b/src/panfrost/vulkan/panvk_priv_bo.c index bfaeabd0c08..27935d4f39c 100644 --- a/src/panfrost/vulkan/panvk_priv_bo.c +++ b/src/panfrost/vulkan/panvk_priv_bo.c @@ -59,10 +59,8 @@ panvk_priv_bo_create(struct panvk_device *dev, size_t size, uint32_t flags, }; if (!(dev->kmod.vm->flags & PAN_KMOD_VM_FLAG_AUTO_VA)) { - simple_mtx_lock(&dev->as.lock); - op.va.start = util_vma_heap_alloc( - &dev->as.heap, op.va.size, op.va.size > 0x200000 ? 0x200000 : 0x1000); - simple_mtx_unlock(&dev->as.lock); + op.va.start = panvk_as_alloc(dev, + op.va.size, op.va.size > 0x200000 ? 0x200000 : 0x1000); if (!op.va.start) { result = panvk_error(dev, VK_ERROR_OUT_OF_DEVICE_MEMORY); goto err_munmap_bo; @@ -90,9 +88,7 @@ panvk_priv_bo_create(struct panvk_device *dev, size_t size, uint32_t flags, err_return_va: if (!(dev->kmod.vm->flags & PAN_KMOD_VM_FLAG_AUTO_VA)) { - simple_mtx_lock(&dev->as.lock); - util_vma_heap_free(&dev->as.heap, op.va.start, op.va.size); - simple_mtx_unlock(&dev->as.lock); + panvk_as_free(dev, op.va.start, op.va.size); } err_munmap_bo: @@ -131,9 +127,7 @@ panvk_priv_bo_destroy(struct panvk_priv_bo *priv_bo) assert(!ret); if (!(dev->kmod.vm->flags & PAN_KMOD_VM_FLAG_AUTO_VA)) { - simple_mtx_lock(&dev->as.lock); - util_vma_heap_free(&dev->as.heap, op.va.start, op.va.size); - simple_mtx_unlock(&dev->as.lock); + panvk_as_free(dev, op.va.start, op.va.size); } if (priv_bo->addr.host) {