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 <boris.brezillon@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/35692>
This commit is contained in:
Caterina Shablia
2025-06-18 18:18:51 +00:00
committed by Marge Bot
parent e16d4b3eba
commit 3653085b45
4 changed files with 31 additions and 40 deletions
+6 -20
View File
@@ -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");
}
+17
View File
@@ -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,
+4 -10
View File
@@ -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);
+4 -10
View File
@@ -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) {