anv/utrace: use a bo pool for utrace buffers

When utrace/perfetto is active, we allocate/free utrace buffers at the
same rate as command buffers. It's useful to have a pool that avoids
GEM_CREATE/GEM_CLOSE ioctls.

v2: Use the pool more

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Acked-by: Caio Oliveira <caio.oliveira@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16613>
This commit is contained in:
Lionel Landwerlin
2022-05-19 20:53:30 +03:00
committed by Marge Bot
parent 0b92636b62
commit c67c9688c3
2 changed files with 16 additions and 15 deletions

View File

@@ -1170,6 +1170,7 @@ struct anv_device {
struct list_head memory_objects; struct list_head memory_objects;
struct anv_bo_pool batch_bo_pool; struct anv_bo_pool batch_bo_pool;
struct anv_bo_pool utrace_bo_pool;
struct anv_bo_cache bo_cache; struct anv_bo_cache bo_cache;

View File

@@ -119,18 +119,15 @@ anv_device_utrace_flush_cmd_buffers(struct anv_queue *queue,
goto error_sync; goto error_sync;
if (utrace_copies > 0) { if (utrace_copies > 0) {
result = result = anv_bo_pool_alloc(&device->utrace_bo_pool,
anv_device_alloc_bo(device, "utrace-copy-buf", utrace_copies * 4096, utrace_copies * 4096,
ANV_BO_ALLOC_MAPPED, 0 /* explicit_address */,
&flush->trace_bo); &flush->trace_bo);
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
goto error_trace_buf; goto error_trace_buf;
result = result = anv_bo_pool_alloc(&device->utrace_bo_pool,
anv_device_alloc_bo(device, "utrace-copy-batch",
/* 128 dwords of setup + 64 dwords per copy */ /* 128 dwords of setup + 64 dwords per copy */
align_u32(512 + 64 * utrace_copies, 4096), align_u32(512 + 64 * utrace_copies, 4096),
ANV_BO_ALLOC_MAPPED, 0 /* explicit_address */,
&flush->batch_bo); &flush->batch_bo);
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
goto error_batch_buf; goto error_batch_buf;
@@ -184,9 +181,9 @@ anv_device_utrace_flush_cmd_buffers(struct anv_queue *queue,
error_batch: error_batch:
anv_reloc_list_finish(&flush->relocs, &device->vk.alloc); anv_reloc_list_finish(&flush->relocs, &device->vk.alloc);
error_reloc_list: error_reloc_list:
anv_device_release_bo(device, flush->batch_bo); anv_bo_pool_free(&device->utrace_bo_pool, flush->batch_bo);
error_batch_buf: error_batch_buf:
anv_device_release_bo(device, flush->trace_bo); anv_bo_pool_free(&device->utrace_bo_pool, flush->trace_bo);
error_trace_buf: error_trace_buf:
vk_sync_destroy(&device->vk, flush->sync); vk_sync_destroy(&device->vk, flush->sync);
error_sync: error_sync:
@@ -202,8 +199,9 @@ anv_utrace_create_ts_buffer(struct u_trace_context *utctx, uint32_t size_b)
struct anv_bo *bo = NULL; struct anv_bo *bo = NULL;
UNUSED VkResult result = UNUSED VkResult result =
anv_device_alloc_bo(device, "utrace-ts", align_u32(size_b, 4096), anv_bo_pool_alloc(&device->utrace_bo_pool,
ANV_BO_ALLOC_MAPPED, 0, &bo); align_u32(size_b, 4096),
&bo);
assert(result == VK_SUCCESS); assert(result == VK_SUCCESS);
return bo; return bo;
@@ -216,7 +214,7 @@ anv_utrace_destroy_ts_buffer(struct u_trace_context *utctx, void *timestamps)
container_of(utctx, struct anv_device, ds.trace_context); container_of(utctx, struct anv_device, ds.trace_context);
struct anv_bo *bo = timestamps; struct anv_bo *bo = timestamps;
anv_device_release_bo(device, bo); anv_bo_pool_free(&device->utrace_bo_pool, bo);
} }
static void static void
@@ -285,6 +283,7 @@ queue_family_to_name(const struct anv_queue_family *family)
void void
anv_device_utrace_init(struct anv_device *device) anv_device_utrace_init(struct anv_device *device)
{ {
anv_bo_pool_init(&device->utrace_bo_pool, device, "utrace");
intel_ds_device_init(&device->ds, &device->info, device->fd, intel_ds_device_init(&device->ds, &device->info, device->fd,
device->physical->local_minor - 128, device->physical->local_minor - 128,
INTEL_DS_API_VULKAN); INTEL_DS_API_VULKAN);
@@ -311,6 +310,7 @@ anv_device_utrace_finish(struct anv_device *device)
{ {
u_trace_context_process(&device->ds.trace_context, true); u_trace_context_process(&device->ds.trace_context, true);
intel_ds_device_fini(&device->ds); intel_ds_device_fini(&device->ds);
anv_bo_pool_finish(&device->utrace_bo_pool);
} }
enum intel_ds_stall_flag enum intel_ds_stall_flag