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:
committed by
Marge Bot
parent
e16d4b3eba
commit
3653085b45
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user