From 0a1539d0c08e4e648bd27d4e3cd8d67313e0ff0a Mon Sep 17 00:00:00 2001 From: Danylo Piliaiev Date: Wed, 6 May 2026 14:19:01 +0200 Subject: [PATCH] tu: Don't leak pre_chain.rp_trace, and correct u_trace_move pre_chain.rp_trace usage relied on a bunch of bad assumptions and together with u_trace_move didn't cause issues until u_trace is started to be refactored. Fixing those bad assumptions and correctly initializing and freeing pre_chain.rp_trace also requires fixing u_trace_move at the same time. u_trace_move fixes: - If dst had trace chunks in it - we may have leaked them. - The correct list move pattern is "list_replace -> list_inithead" not "list_replace -> list_delinit" Signed-off-by: Danylo Piliaiev --- src/freedreno/vulkan/tu_cmd_buffer.cc | 5 +++++ src/util/perf/u_trace.c | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/freedreno/vulkan/tu_cmd_buffer.cc b/src/freedreno/vulkan/tu_cmd_buffer.cc index 9e00175d80f..5abf26190e9 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.cc +++ b/src/freedreno/vulkan/tu_cmd_buffer.cc @@ -4109,6 +4109,7 @@ tu_create_cmd_buffer(struct vk_command_pool *pool, u_trace_init(&cmd_buffer->trace, &device->trace_context); u_trace_init(&cmd_buffer->rp_trace, &device->trace_context); + u_trace_init(&cmd_buffer->pre_chain.rp_trace, &device->trace_context); cmd_buffer->trace_renderpass_start = u_trace_begin_iterator(&cmd_buffer->rp_trace); new (&cmd_buffer->autotune_ctx) tu_autotune::cmd_buf_ctx(*device->autotune); @@ -4159,6 +4160,7 @@ tu_cmd_buffer_destroy(struct vk_command_buffer *vk_cmd_buffer) u_trace_fini(&cmd_buffer->trace); u_trace_fini(&cmd_buffer->rp_trace); + u_trace_fini(&cmd_buffer->pre_chain.rp_trace); cmd_buffer->autotune_ctx.~cmd_buf_ctx(); @@ -4267,6 +4269,9 @@ tu_reset_cmd_buffer(struct vk_command_buffer *vk_cmd_buffer, u_trace_init(&cmd_buffer->trace, &cmd_buffer->device->trace_context); u_trace_fini(&cmd_buffer->rp_trace); u_trace_init(&cmd_buffer->rp_trace, &cmd_buffer->device->trace_context); + u_trace_fini(&cmd_buffer->pre_chain.rp_trace); + u_trace_init(&cmd_buffer->pre_chain.rp_trace, + &cmd_buffer->device->trace_context); cmd_buffer->trace_renderpass_start = u_trace_begin_iterator(&cmd_buffer->rp_trace); diff --git a/src/util/perf/u_trace.c b/src/util/perf/u_trace.c index c5c25eb67e3..c3698a04c12 100644 --- a/src/util/perf/u_trace.c +++ b/src/util/perf/u_trace.c @@ -796,11 +796,13 @@ u_trace_init(struct u_trace *ut, struct u_trace_context *utctx) void u_trace_move(struct u_trace *dst, struct u_trace *src) { + u_trace_fini(dst); + dst->utctx = src->utctx; list_replace(&src->trace_chunks, &dst->trace_chunks); dst->num_traces = src->num_traces; src->num_traces = 0; - list_delinit(&src->trace_chunks); + list_inithead(&src->trace_chunks); } void