diff options
| author | Kevin Wolf <kwolf@redhat.com> | 2014-11-28 15:23:12 +0100 |
|---|---|---|
| committer | Kevin Wolf <kwolf@redhat.com> | 2016-06-16 15:19:55 +0200 |
| commit | ccb9dc10129954d0bcd7814298ed445e684d5a2a (patch) | |
| tree | a49245ab66bad93ba8e4c5f7776ac02e5f31770a | |
| parent | 23b0d9fb1dd39d85fc2e0cabba5cbe005126e7b5 (diff) | |
| download | focaccia-qemu-ccb9dc10129954d0bcd7814298ed445e684d5a2a.tar.gz focaccia-qemu-ccb9dc10129954d0bcd7814298ed445e684d5a2a.zip | |
linux-aio: Cancel BH if not needed
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 <kwolf@redhat.com> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
| -rw-r--r-- | block/linux-aio.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/block/linux-aio.c b/block/linux-aio.c index fe7cece415..e468960146 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); } } |