qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [RFC v6 15/27] monitor: let suspend/resume work even wi


From: Fam Zheng
Subject: Re: [Qemu-devel] [RFC v6 15/27] monitor: let suspend/resume work even with QMPs
Date: Thu, 21 Dec 2017 19:27:38 +0800
User-agent: Mutt/1.9.1 (2017-09-22)

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 <address@hidden>
> ---
>  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
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]