@samitouri / QOSamiQemu / commits / d5ab0bdefe

target/riscv: Fix memory leak in riscv_trigger_unrealize()

In riscv_trigger_unrealize(), the per-trigger QEMUTimer objects are created in riscv_trigger_realize() using timer_new_ns(). However, unrealize only calls timer_del() to cancel them, but never frees the timer objects themselves. This results in a memory leak every time a CPU instance is unrealized (e.g., during hot-unplug or machine teardown). Fix it by replacing timer_del() with timer_free(), which internally cancels the timer and frees its memory. The separate timer_del() call is no longer needed. Fixes: 820552a92e32 ("target/riscv: dynamic alloc of debug trigger arrays") Signed-off-by: Zeng Chi <zengchi@kylinos.cn> Reviewed-by: Daniel Henrique Barboza <daniel.barboza@oss.qualcomm.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com> Message-ID: <20260724063927.3360599-1-zeng_chi911@163.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>

Zeng Chi committed Jul 24, 2026 at 14:39 UTC d5ab0bdefe418593a744fd0c625add607117c972
1 file changed +1 -1
target/riscv/tcg/debug.c
+1 -1
@@ -1080,7 +1080,7 @@ void riscv_trigger_unrealize(CPURISCVState *env)
1080 g_free(env->cpu_watchpoint);
1081
1082 for (int i = 0; i < env->num_triggers; i++) {
1083 - timer_del(env->itrigger_timer[i]);
1083 + timer_free(env->itrigger_timer[i]);
1084 }
1085 g_free(env->itrigger_timer);
1086 }