On Tue, 12/19 16:45, Peter Xu wrote: > One thing to mention is that for QMPs that are using IOThreads, we need > an explicit kick for the IOThread in case it is sleeping. > > Since at it, add traces for the operations. > > Signed-off-by: Peter Xu <pet...@redhat.com> > --- > monitor.c | 26 +++++++++++++++++++++----- > trace-events | 1 + > 2 files changed, 22 insertions(+), 5 deletions(-) > > diff --git a/monitor.c b/monitor.c > index 844508d134..5f05f2e9da 100644 > --- a/monitor.c > +++ b/monitor.c > @@ -3992,19 +3992,35 @@ static void monitor_command_cb(void *opaque, const > char *cmdline, > > int monitor_suspend(Monitor *mon) > { > - if (!mon->rs) > - return -ENOTTY;
Please add to the commit message why the mon->rs check is dropped, for this and the other one. Fam > atomic_inc(&mon->suspend_cnt); > + if (monitor_is_qmp(mon)) { > + /* > + * Kick iothread to make sure this takes effect. It'll be > + * evaluated again in prepare() of the watch object. > + */ > + aio_notify(iothread_get_aio_context(mon_global.mon_iothread)); > + } > + trace_monitor_suspend(mon, 1); > return 0; > } > > void monitor_resume(Monitor *mon) > { > - if (!mon->rs) > - return; > if (atomic_dec_fetch(&mon->suspend_cnt) == 0) { > - readline_show_prompt(mon->rs); > + if (monitor_is_qmp(mon)) { > + /* > + * For QMP monitors that are running in IOThread, let's > + * kick the thread in case it's sleeping. > + */ > + if (mon->use_io_thr) { > + > aio_notify(iothread_get_aio_context(mon_global.mon_iothread)); > + } > + } else { > + assert(mon->rs); > + readline_show_prompt(mon->rs); > + } > } > + trace_monitor_suspend(mon, -1); > } > > static QObject *get_qmp_greeting(Monitor *mon) > diff --git a/trace-events b/trace-events > index 1d2eb5d3e4..2646241a0f 100644 > --- a/trace-events > +++ b/trace-events > @@ -47,6 +47,7 @@ monitor_protocol_event_emit(uint32_t event, void *data) > "event=%d data=%p" > monitor_protocol_event_queue(uint32_t event, void *qdict, uint64_t rate) > "event=%d data=%p rate=%" PRId64 > handle_hmp_command(void *mon, const char *cmdline) "mon %p cmdline: %s" > handle_qmp_command(void *mon, const char *req) "mon %p req: %s" > +monitor_suspend(void *ptr, int cnt) "mon %p: %d" > > # dma-helpers.c > dma_blk_io(void *dbs, void *bs, int64_t offset, bool to_dev) "dbs=%p bs=%p > offset=%" PRId64 " to_dev=%d" > -- > 2.14.3 >