From: Kevin Wolf <kwolf@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: Fam Zheng <famz@redhat.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
Ming Lei <tom.leiming@gmail.com>,
qemu-devel <qemu-devel@nongnu.org>,
Stefan Hajnoczi <stefanha@redhat.com>,
Stefan Hajnoczi <stefanha@gmail.com>
Subject: Re: [Qemu-devel] [regression] dataplane: throughout -40% by commit 580b6b2aa2
Date: Wed, 2 Jul 2014 11:39:30 +0200 [thread overview]
Message-ID: <20140702093930.GF5996@noname.str.redhat.com> (raw)
In-Reply-To: <53B3CD3C.4040506@redhat.com>
Am 02.07.2014 um 11:13 hat Paolo Bonzini geschrieben:
> Il 02/07/2014 10:54, Stefan Hajnoczi ha scritto:
> >>Both can be eliminated by introducing a fast path in bdrv_aio_{read,write}v,
> >>that bypasses coroutines in the common case of no I/O throttling, no
> >>copy-on-write, etc.
> >
> >I tried that in 2012 and couldn't measure an improvement above the noise
> >threshold, although it was without dataplane.
> >
> >BTW, we cannot eliminate the BH because the block layer guarantees that
> >callbacks are not invoked with reentrancy. They are always invoked
> >directly from the event loop through a BH. This simplifies callers
> >since they don't need to worry about callbacks happening while they are
> >still in bdrv_aio_readv(), for example.
> >
> >Removing this guarantee (by making callers safe first) is orthogonal to
> >coroutines. But it's hard to do since it requires auditing a lot of
> >code.
>
> You could also audit the few implementations of
> bdrv_aio_readv/writev (including bdrv_aio_readv/writev_em) to
> guarantee that they do not directly invoke the callbacks. The rule
> was there before conversion to coroutine, so the implementations
> should be fine. In fact, most of them are just forwarding to
> another bdrv_aio_readv/writev, and the others go through an
> EventNotifier or bottom half.
>
> Drivers that implement bdrv_co_readv/writev would not enjoy the fast
> path, and would keep using the BH.
I don't think starting with that fast path as _the_ solution is a good
idea. It would essentially restrict dataplane to the scenarios that used
to work well in 2.0 - just look at what the block.c read/write functions
do: no image formats, (almost?) no block jobs, no 4k sector support, no
writethrough mode, no zero detection, no throttling, no nothing.
Anything we want to keep while using the fast path we would have to
duplicate there.
I much prefer to approach to make it use the normal path and optimise
that one, so that all cases benefit from it. We can probably get the
same results with coroutines - if the BH isn't necessary with AIO in the
common case, it also isn't necessary with coroutines.
> >Another idea is to skip aio_notify() when we're sure the event loop
> >isn't blocked in g_poll(). Doing this is a thread-safe and lockless way
> >might be tricky though.
>
> Yes, good idea for 2.2 but not now.
Isn't it a first approximation that it's unnecessary when we're already
running in the thread with the AIO main loop? (Which pretty much means
always with dataplane.) Or can it be required even when we don't switch
to a different thread?
> >3. The block layer requires a BH with aio_notify() for
> >bdrv_aio_readv()/bdrv_aio_writev()/bdrv_aio_flush() callbacks regardless
> >of coroutines or not. Eliminating the BH or skipping aio_notify() will
> >take some work but could speed up QEMU as a whole.
>
> I think (3) is not really true, and the BH is the actual reason why
> coroutines are slower.
Can't we provide a mechanism with coroutines that checks whether we've
been reentered from the main loop at least once, so that we can avoid
the BH then?
We would still have to think about which stack we want to run it on, but
there would definitely be no aio_notify() involved then.
Kevin
next prev parent reply other threads:[~2014-07-02 9:39 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-26 15:14 [Qemu-devel] [regression] dataplane: throughout -40% by commit 580b6b2aa2 Ming Lei
2014-06-26 15:29 ` Paolo Bonzini
2014-06-26 15:37 ` Ming Lei
2014-06-26 15:43 ` Paolo Bonzini
2014-06-26 15:47 ` Ming Lei
2014-06-26 15:57 ` Paolo Bonzini
2014-06-27 1:15 ` Ming Lei
2014-06-27 4:59 ` Paolo Bonzini
2014-06-27 6:23 ` Kevin Wolf
2014-06-27 7:35 ` Paolo Bonzini
2014-06-27 12:35 ` Ming Lei
2014-06-27 7:57 ` Ming Lei
2014-06-27 12:01 ` Stefan Hajnoczi
2014-06-27 12:21 ` Kevin Wolf
2014-06-27 14:50 ` Stefan Hajnoczi
2014-06-27 18:01 ` Ming Lei
2014-06-27 21:51 ` Paolo Bonzini
2014-06-28 9:58 ` Ming Lei
2014-06-30 8:08 ` Stefan Hajnoczi
2014-06-30 8:27 ` Ming Lei
2014-07-01 13:53 ` Ming Lei
2014-07-01 14:31 ` Stefan Hajnoczi
2014-07-01 14:49 ` Ming Lei
2014-07-01 16:49 ` Paolo Bonzini
2014-07-02 0:48 ` Ming Lei
2014-07-02 8:54 ` Stefan Hajnoczi
2014-07-02 9:13 ` Paolo Bonzini
2014-07-02 9:39 ` Kevin Wolf [this message]
2014-07-02 9:48 ` Paolo Bonzini
2014-07-02 10:01 ` Kevin Wolf
2014-07-02 10:23 ` Paolo Bonzini
2014-07-02 15:45 ` Ming Lei
2014-07-02 16:13 ` Ming Lei
2014-07-02 16:23 ` Paolo Bonzini
2014-07-02 16:27 ` Ming Lei
2014-07-02 16:38 ` Paolo Bonzini
2014-07-02 16:41 ` Ming Lei
2014-07-02 16:21 ` Paolo Bonzini
2014-07-03 4:54 ` Ming Lei
2014-07-03 10:29 ` Paolo Bonzini
2014-07-03 11:50 ` Ming Lei
2014-07-03 11:56 ` Paolo Bonzini
2014-07-03 12:09 ` Ming Lei
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=20140702093930.GF5996@noname.str.redhat.com \
--to=kwolf@redhat.com \
--cc=famz@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@gmail.com \
--cc=stefanha@redhat.com \
--cc=tom.leiming@gmail.com \
/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).