From: Peter Xu <peterx@redhat.com>
To: "Marc-André Lureau" <marcandre.lureau@gmail.com>
Cc: QEMU <qemu-devel@nongnu.org>,
"Dr. David Alan Gilbert" <dgilbert@redhat.com>,
Markus Armbruster <armbru@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v8 2/6] monitor: resume the monitor earlier if needed
Date: Mon, 8 Oct 2018 15:15:23 +0800 [thread overview]
Message-ID: <20181008071523.GI18728@xz-x1> (raw)
In-Reply-To: <CAJ+F1CJhXJEwkcrOqDGXjBG+m9NJG8HK0+C0vMxpQmqxWF0MYQ@mail.gmail.com>
On Tue, Oct 02, 2018 at 01:13:10PM +0400, Marc-André Lureau wrote:
> Hi Peter
>
> On Sat, Sep 29, 2018 at 8:05 AM Peter Xu <peterx@redhat.com> wrote:
> >
> > On Fri, Sep 28, 2018 at 04:06:30PM +0400, Marc-André Lureau wrote:
> > > Hi
> > >
> > > On Wed, Sep 5, 2018 at 10:24 AM Peter Xu <peterx@redhat.com> wrote:
> > > >
> > > > Currently when QMP request queue full we won't resume the monitor until
> > > > we have completely handled the current command. It's not necessary
> > > > since even before it's handled the queue is already non-full. Moving
> > > > the resume logic earlier before the command execution, hence drop the
> > > > need_resume local variable.
> > > >
> > > > Signed-off-by: Peter Xu <peterx@redhat.com>
> > > > ---
> > > > monitor.c | 12 +++++-------
> > > > 1 file changed, 5 insertions(+), 7 deletions(-)
> > > >
> > > > diff --git a/monitor.c b/monitor.c
> > > > index a89bb86599..c2c9853f75 100644
> > > > --- a/monitor.c
> > > > +++ b/monitor.c
> > > > @@ -4130,7 +4130,6 @@ static void monitor_qmp_bh_dispatcher(void *data)
> > > > {
> > > > QMPRequest *req_obj = monitor_qmp_requests_pop_any_with_lock();
> > > > QDict *rsp;
> > > > - bool need_resume;
> > > > Monitor *mon;
> > > >
> > > > if (!req_obj) {
> > > > @@ -4139,8 +4138,11 @@ static void monitor_qmp_bh_dispatcher(void *data)
> > > >
> > > > mon = req_obj->mon;
> > > > /* qmp_oob_enabled() might change after "qmp_capabilities" */
> > > > - need_resume = !qmp_oob_enabled(mon) ||
> > > > - mon->qmp.qmp_requests->length == QMP_REQ_QUEUE_LEN_MAX - 1;
> > > > + if (!qmp_oob_enabled(mon) ||
> > > > + mon->qmp.qmp_requests->length == QMP_REQ_QUEUE_LEN_MAX - 1) {
> > > > + /* Pairs with the monitor_suspend() in handle_qmp_command() */
> > > > + monitor_resume(mon);
> > > > + }
> > >
> > > With spice chardev, this may result in a synchronous write.
> > > If I read it right, this may re-enter handle_qmp_command and dead-lock
> > > on qemu_mutex_lock(&mon->qmp.qmp_queue_lock);
> > >
> > > So at least I would release the lock before resuming :)
> >
> > For sure this I can do. :) Though I'd like to know more context too.
> >
> > I just noticed that we added the qemu_chr_fe_accept_input() call into
> > monitor_resume() a month ago which I completely unaware of... then the
> > resuming could be a heavy-weighted function now. I'm a bit worried on
> > whether this would affect the oob thing since noting that we're still
> > in the monitor iothread (which should not block for long). Especially
> > if you mentioned that we'll handle commands again, then could we
> > potentially run non-oob command handlers in oob context here simply
> > due to the call to monitor_resume()?
>
> monitor_resume() is only called from main thread, afaict.
My fault on misreading on that; yes it's only called in main thread.
>
> So I think the problem is rather that qemu_chr_fe_accept_input() is
> not thread safe (if the same charfe is used in a different thread,
> like mon_iothread).
>
> So instead of simply kicking the mon_iothread, we should probably
> schedule a BH to call accept input.
Hmm, could you help explain why we need to make
qemu_chr_fe_accept_input() thread safe? I see that's only called in
main thread as well (besides the call in monitor_resume, it's mostly
in memory region ops), or did I misread again?
Regards,
--
Peter Xu
next prev parent reply other threads:[~2018-10-08 7:15 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-09-05 6:23 [Qemu-devel] [PATCH v8 0/6] monitor: enable OOB by default Peter Xu
2018-09-05 6:23 ` [Qemu-devel] [PATCH v8 1/6] monitor: Suspend monitor instead dropping commands Peter Xu
2018-09-05 6:23 ` [Qemu-devel] [PATCH v8 2/6] monitor: resume the monitor earlier if needed Peter Xu
[not found] ` <CAJ+F1CJJB2ZyTQ3OBJ+c49bqZMWSKqfp7UOoM7QBEhH6Exnsbg@mail.gmail.com>
[not found] ` <20180929040529.GQ9560@xz-x1>
2018-10-02 9:13 ` Marc-André Lureau
2018-10-08 7:15 ` Peter Xu [this message]
2018-10-09 12:26 ` Marc-André Lureau
2018-09-05 6:23 ` [Qemu-devel] [PATCH v8 3/6] monitor: remove "x-oob", turn oob on by default Peter Xu
2018-09-05 6:23 ` [Qemu-devel] [PATCH v8 4/6] Revert "tests: Add parameter to qtest_init_without_qmp_handshake" Peter Xu
2018-09-05 6:23 ` [Qemu-devel] [PATCH v8 5/6] tests: add oob functional test for test-qmp-cmds Peter Xu
2018-09-05 6:23 ` [Qemu-devel] [PATCH v8 6/6] tests: qmp-test: add queue full test Peter Xu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181008071523.GI18728@xz-x1 \
--to=peterx@redhat.com \
--cc=armbru@redhat.com \
--cc=dgilbert@redhat.com \
--cc=marcandre.lureau@gmail.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).