On 03/10/2016 02:51 AM, Fam Zheng wrote: [...] > The aio_poll() inside "blk_set_aio_context(s->conf->conf.blk, s->ctx)" looks > suspicious: > > main thread iothread > ---------------------------------------------------------------------------- > virtio_blk_handle_output() > virtio_blk_data_plane_start() > vblk->dataplane_started = true; > blk_set_aio_context() > bdrv_set_aio_context() > bdrv_drain() > aio_poll() > <snip...> > virtio_blk_handle_output() > /* s->dataplane_started is true */ > !!! -> virtio_blk_handle_request() > event_notifier_set(ioeventfd) > aio_poll() > > virtio_blk_handle_request() > > Christian, could you try the followed patch? The aio_poll above is replaced > with a "limited aio_poll" that doesn't disptach ioeventfd. > > (Note: perhaps moving "vblk->dataplane_started = true;" after > blk_set_aio_context() also *works around* this.) > > --- > > diff --git a/block.c b/block.c > index ba24b8e..e37e8f7 100644 > --- a/block.c > +++ b/block.c > @@ -4093,7 +4093,9 @@ void bdrv_attach_aio_context(BlockDriverState *bs, > > void bdrv_set_aio_context(BlockDriverState *bs, AioContext *new_context) > { > - bdrv_drain(bs); /* ensure there are no in-flight requests */ > + /* ensure there are no in-flight requests */ > + bdrv_drained_begin(bs); > + bdrv_drained_end(bs); > > bdrv_detach_aio_context(bs); >
That seems to do the trick.