On 15/06/2016 13:16, Kevin Wolf wrote: > linux-aio uses a BH in order to make sure that the remaining completions > are processed even in nested event loops of completion callbacks in > order to avoid deadlocks. > > There is no need, however, to have the BH overhead for the first call > into qemu_laio_completion_bh() or after all pending completions have > already been processed. Therefore, this patch calls directly into > qemu_laio_completion_bh() in qemu_laio_completion_cb() and cancels > the BH after qemu_laio_completion_bh() has processed all pending > completions. > > Signed-off-by: Kevin Wolf <kw...@redhat.com> > --- > block/linux-aio.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/block/linux-aio.c b/block/linux-aio.c > index fe7cece..e468960 100644 > --- a/block/linux-aio.c > +++ b/block/linux-aio.c > @@ -149,6 +149,8 @@ static void qemu_laio_completion_bh(void *opaque) > if (!s->io_q.plugged && !QSIMPLEQ_EMPTY(&s->io_q.pending)) { > ioq_submit(s); > } > + > + qemu_bh_cancel(s->completion_bh); > } > > static void qemu_laio_completion_cb(EventNotifier *e) > @@ -156,7 +158,7 @@ static void qemu_laio_completion_cb(EventNotifier *e) > LinuxAioState *s = container_of(e, LinuxAioState, e); > > if (event_notifier_test_and_clear(&s->e)) { > - qemu_bh_schedule(s->completion_bh); > + qemu_laio_completion_bh(s); > } > } > >
Reviewed-by: Paolo Bonzini <pbonz...@redhat.com>