From 2c5f88a07476566a398dfbfb0659ac980948ef85 Mon Sep 17 00:00:00 2001 From: Caterina Shablia Date: Tue, 9 Sep 2025 22:49:31 +0000 Subject: [PATCH] panvk: introduce panvk_get_gpu_page_size This function returns the page size of the VM that we're using. The GPU page size might be different from what the host process uses. Reviewed-by: Boris Brezillon Part-of: --- src/panfrost/vulkan/csf/panvk_vX_gpu_queue.c | 4 ++-- src/panfrost/vulkan/panvk_device.h | 6 ++++++ src/panfrost/vulkan/panvk_mempool.c | 4 +++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/panfrost/vulkan/csf/panvk_vX_gpu_queue.c b/src/panfrost/vulkan/csf/panvk_vX_gpu_queue.c index 7dcc8417bc1..df5f505ea7e 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_gpu_queue.c +++ b/src/panfrost/vulkan/csf/panvk_vX_gpu_queue.c @@ -190,7 +190,7 @@ finish_subqueue_tracing(struct panvk_gpu_queue *queue, struct panvk_subqueue *subq = &queue->subqueues[subqueue]; if (subq->tracebuf.addr.dev) { - size_t pgsize = getpagesize(); + uint64_t pgsize = panvk_get_gpu_page_size(dev); pandecode_inject_free(dev->debug.decode_ctx, subq->tracebuf.addr.dev, subq->tracebuf.size); @@ -265,7 +265,7 @@ init_subqueue_tracing(struct panvk_gpu_queue *queue, } /* Add a guard page. */ - size_t pgsize = getpagesize(); + uint64_t pgsize = panvk_get_gpu_page_size(dev); dev_addr = panvk_as_alloc(dev, subq->tracebuf.size + pgsize, pgsize); if (!dev_addr) diff --git a/src/panfrost/vulkan/panvk_device.h b/src/panfrost/vulkan/panvk_device.h index 0174ce39331..b97bb1cb006 100644 --- a/src/panfrost/vulkan/panvk_device.h +++ b/src/panfrost/vulkan/panvk_device.h @@ -151,6 +151,12 @@ panvk_device_adjust_bo_flags(const struct panvk_device *device, return bo_flags; } +static inline uint64_t +panvk_get_gpu_page_size(const struct panvk_device *device) +{ + return (uint64_t)1 << (ffsll(device->kmod.vm->pgsize_bitmap) - 1); +} + static inline uint64_t panvk_as_alloc(struct panvk_device *device, uint64_t size, uint64_t alignment) { diff --git a/src/panfrost/vulkan/panvk_mempool.c b/src/panfrost/vulkan/panvk_mempool.c index 491bc9afcc9..998d9b2d70b 100644 --- a/src/panfrost/vulkan/panvk_mempool.c +++ b/src/panfrost/vulkan/panvk_mempool.c @@ -23,6 +23,7 @@ * */ +#include "panvk_device.h" #include "panvk_mempool.h" #include "panvk_priv_bo.h" @@ -55,7 +56,8 @@ panvk_bo_pool_cleanup(struct panvk_bo_pool *bo_pool) static struct panvk_priv_bo * panvk_pool_alloc_backing(struct panvk_pool *pool, size_t sz) { - size_t bo_sz = ALIGN_POT(MAX2(pool->base.slab_size, sz), 4096); + size_t bo_sz = ALIGN_POT(MAX2(pool->base.slab_size, sz), + panvk_get_gpu_page_size(pool->dev)); struct panvk_priv_bo *bo = NULL; /* If there's a free BO in our BO pool, let's pick it. */