linux-aio: avoid deadlock in nested aio_poll() calls
commit2cdff7f620ebd3b5246cf0c0d1f6fa0eededa4ca
authorStefan Hajnoczi <stefanha@redhat.com>
Mon, 4 Aug 2014 15:56:33 +0000 (4 16:56 +0100)
committerStefan Hajnoczi <stefanha@redhat.com>
Fri, 29 Aug 2014 14:59:17 +0000 (29 15:59 +0100)
tree579628c500f643464fd8138d68257d1e9dfc1968
parent12ade7609004bb1b09a845c144b36ea1850854c7
linux-aio: avoid deadlock in nested aio_poll() calls

If two Linux AIO request completions are fetched in the same
io_getevents() call, QEMU will deadlock if request A's callback waits
for request B to complete using an aio_poll() loop.  This was reported
to happen with the mirror blockjob.

This patch moves completion processing into a BH and makes it resumable.
Nested event loops can resume completion processing so that request B
will complete and the deadlock will not occur.

Cc: Kevin Wolf <kwolf@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Ming Lei <ming.lei@canonical.com>
Cc: Marcin Gibuła <m.gibula@beyond.pl>
Reported-by: Marcin Gibuła <m.gibula@beyond.pl>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Tested-by: Marcin Gibuła <m.gibula@beyond.pl>
block/linux-aio.c