From: Miguel Luis <miguel.l...@oracle.com> Introduce the TCG thread unregistration leg which shall be called in context to TCG/vCPU unrealize.
Reported-by: Salil Mehta <salil.me...@huawei.com> Signed-off-by: Miguel Luis <miguel.l...@oracle.com> Signed-off-by: Salil Mehta <salil.me...@huawei.com> --- accel/tcg/tcg-accel-ops-mttcg.c | 1 + include/tcg/startup.h | 7 +++++++ tcg/tcg.c | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/accel/tcg/tcg-accel-ops-mttcg.c b/accel/tcg/tcg-accel-ops-mttcg.c index ab2f79d2c7..4b26164ffd 100644 --- a/accel/tcg/tcg-accel-ops-mttcg.c +++ b/accel/tcg/tcg-accel-ops-mttcg.c @@ -122,6 +122,7 @@ static void *mttcg_cpu_thread_fn(void *arg) bql_unlock(); rcu_remove_force_rcu_notifier(&force_rcu.notifier); rcu_unregister_thread(); + tcg_unregister_thread(); return NULL; } diff --git a/include/tcg/startup.h b/include/tcg/startup.h index a565071516..c035d03f7e 100644 --- a/include/tcg/startup.h +++ b/include/tcg/startup.h @@ -51,6 +51,13 @@ void tcg_register_thread(void); void tcg_register_thread(CPUState *cpu); #endif +/** + * tcg_unregister_thread: Unregister this thread with the TCG runtime + * + * This leg shall be called whenever TCG vCPU is hot-unplugged + */ +void tcg_unregister_thread(void); + /** * tcg_prologue_init(): Generate the code for the TCG prologue * diff --git a/tcg/tcg.c b/tcg/tcg.c index 5e9c6b2b4b..3bdebdb332 100644 --- a/tcg/tcg.c +++ b/tcg/tcg.c @@ -811,6 +811,39 @@ void tcg_register_thread(CPUState *cpu) tcg_ctx = s; } + +static void tcg_free_plugin_context(TCGContext *s) +{ +#ifdef CONFIG_PLUGIN + unsigned i; + + if (s->plugin_tb) { + for (i = 0; i < s->plugin_tb->insns->len; i++) { + g_free(g_ptr_array_index(s->plugin_tb->insns, i)); + } + g_ptr_array_free(s->plugin_tb->insns, TRUE); + + if (!s->plugin_tb->insns) { + g_free(s->plugin_tb); + } + } +#endif +} + +void tcg_unregister_thread(void) +{ + TCGContext *s = tcg_ctx; + unsigned int n; + + /* unclaim an entry in tcg_ctxs */ + n = qatomic_fetch_dec(&tcg_cur_ctxs); + g_assert(n > 1); + qatomic_store_release(&tcg_ctxs[n - 1], 0); + + tcg_free_plugin_context(s); + + g_free(s); +} #endif /* !CONFIG_USER_ONLY */ /* pool based memory allocation */ -- 2.34.1