On Tue, May 19, 2020 at 06:11:38PM +0100, Stefan Hajnoczi wrote: > QEMU block drivers are supposed to support aio_poll() from I/O > completion callback functions. This means completion processing must be > re-entrant. > > The standard approach is to schedule a BH during completion processing > and cancel it at the end of processing. If aio_poll() is invoked by a > callback function then the BH will run. The BH continues the suspended > completion processing. > > All of this means that request A's cb() can synchronously wait for > request B to complete. Previously the nvme block driver would hang > because it didn't process completions from nested aio_poll(). > > Signed-off-by: Stefan Hajnoczi > --- > block/nvme.c | 67 ++++++++++++++++++++++++++++++++++++++++------ > block/trace-events | 2 +- > 2 files changed, 60 insertions(+), 9 deletions(-) Reviewed-by: Sergio Lopez