On Tue, Dec 05, 2017 at 01:51:44PM +0800, Peter Xu wrote: > @@ -583,6 +585,7 @@ static void monitor_data_init(Monitor *mon, bool > skip_flush) > /* Use *mon_cmds by default. */ > mon->cmd_table = mon_cmds; > mon->skip_flush = skip_flush; > + mon->use_io_thr = use_io_thr;
Why is mon->use_io_thr is a field instead of a monitor_init() argument.
> @@ -4117,19 +4121,37 @@ void monitor_init(Chardev *chr, int flags)
> monitor_read_command(mon, 0);
> }
>
> + if (mon->use_io_thr) {
> + /*
> + * When use_io_thr is set, we use the global shared dedicated
> + * IO thread for this monitor to handle input/output.
> + */
> + context = monitor_io_context_get();
> + /* We should have inited globals before reaching here. */
> + assert(context);
> + } else {
> + /* The default main loop, which is the main thread */
> + context = NULL;
> + }
> +
> + /*
> + * Add the monitor before running it (which is triggered by
> + * qemu_chr_fe_set_handlers), otherwise one monitor may find
> + * itself not on the mon_list when running.
> + */
> + qemu_mutex_lock(&monitor_lock);
> + QTAILQ_INSERT_HEAD(&mon_list, mon, entry);
> + qemu_mutex_unlock(&monitor_lock);
> +
> if (monitor_is_qmp(mon)) {
> qemu_chr_fe_set_handlers(&mon->chr, monitor_can_read,
> monitor_qmp_read,
> - monitor_qmp_event, NULL, mon, NULL, true);
> + monitor_qmp_event, NULL, mon, context,
> true);
> qemu_chr_fe_set_echo(&mon->chr, true);
> json_message_parser_init(&mon->qmp.parser, handle_qmp_command, mon);
The comment above mentions the race condition between
qemu_chr_fe_set_handlers() and mon_list. I think that means the order
must be:
json_message_parser_init(&mon->qmp.parser, handle_qmp_command, mon);
qemu_chr_fe_set_echo(&mon->chr, true);
qemu_chr_fe_set_handlers(&mon->chr, monitor_can_read, monitor_qmp_read,
monitor_qmp_event, NULL, mon, context, true);
> } else {
assert(!context); /* HMP does not support IOThreads */
> qemu_chr_fe_set_handlers(&mon->chr, monitor_can_read, monitor_read,
> monitor_event, NULL, mon, NULL, true);
> }
> -
> - qemu_mutex_lock(&monitor_lock);
> - QLIST_INSERT_HEAD(&mon_list, mon, entry);
> - qemu_mutex_unlock(&monitor_lock);
> }
>
> void monitor_cleanup(void)
> --
> 2.14.3
>
signature.asc
Description: PGP signature
