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 <[email protected]>
> ---
> 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
>