Based on monitor ID tracking iothread users with holder. Introduce the AioContext in the Monitor struct to avoid repeated calls to iothread_get_aio_context() and ensure symmetrical ref/unref during monitor lifecycle.
Signed-off-by: Zhang Chen <[email protected]> --- monitor/monitor-internal.h | 3 +++ monitor/monitor.c | 20 ++++++++++++++++++-- monitor/qmp.c | 3 ++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/monitor/monitor-internal.h b/monitor/monitor-internal.h index 2060311b03..92d7630921 100644 --- a/monitor/monitor-internal.h +++ b/monitor/monitor-internal.h @@ -127,6 +127,9 @@ struct Monitor { guint out_watch; int mux_out; int reset_seen; + + /* iothread context */ + AioContext *ctx; }; struct MonitorHMP { diff --git a/monitor/monitor.c b/monitor/monitor.c index dafb4ad8b0..7eec6f967d 100644 --- a/monitor/monitor.c +++ b/monitor/monitor.c @@ -529,7 +529,7 @@ int monitor_suspend(Monitor *mon) * Kick I/O thread to make sure this takes effect. It'll be * evaluated again in prepare() of the watch object. */ - aio_notify(iothread_get_aio_context(mon_iothread)); + aio_notify(mon->ctx); } trace_monitor_suspend(mon, 1); @@ -564,7 +564,7 @@ void monitor_resume(Monitor *mon) AioContext *ctx; if (mon->use_io_thread) { - ctx = iothread_get_aio_context(mon_iothread); + ctx = mon->ctx; } else { ctx = qemu_get_aio_context(); } @@ -612,6 +612,12 @@ void monitor_data_init(Monitor *mon, bool is_qmp, bool skip_flush, { if (use_io_thread && !mon_iothread) { monitor_iothread_init(); + + IOThreadHolder holder = { + .type = IO_THREAD_HOLDER_KIND_MONITOR_NAME, + .u.monitor_name.monitor_name = (char *)mon->id, + }; + mon->ctx = iothread_ref_and_get_aio_context(mon_iothread, &holder); } qemu_mutex_init(&mon->mon_lock); mon->is_qmp = is_qmp; @@ -631,6 +637,16 @@ void monitor_data_destroy(Monitor *mon) } g_string_free(mon->outbuf, true); qemu_mutex_destroy(&mon->mon_lock); + + if (mon->ctx && mon_iothread) { + IOThreadHolder holder = { + .type = IO_THREAD_HOLDER_KIND_MONITOR_NAME, + .u.monitor_name.monitor_name = (char *)mon->id, + }; + + iothread_put_aio_context(mon_iothread, &holder); + mon->ctx = NULL; + } } void monitor_cleanup(void) diff --git a/monitor/qmp.c b/monitor/qmp.c index b210850a15..b67674aef3 100644 --- a/monitor/qmp.c +++ b/monitor/qmp.c @@ -565,7 +565,8 @@ void monitor_init_qmp(Chardev *chr, bool pretty, const char *id, Error **errp) * since chardev might be running in the monitor I/O * thread. Schedule a bottom half. */ - aio_bh_schedule_oneshot(iothread_get_aio_context(mon_iothread), + Monitor *mon_p = &mon->common; + aio_bh_schedule_oneshot(mon_p->ctx, monitor_qmp_setup_handlers_bh, mon); /* The bottom half will add @mon to @mon_list */ } else { -- 2.49.0
