On Tue, May 17, 2016 at 04:57:28PM +0200, Paolo Bonzini wrote: > That said, there is at least another case where it will be used. In the > dataplane branch, where AIO callbacks take the AioContext mutex > themselves, we have: > > static void bdrv_co_io_em_complete(void *opaque, int ret) > { > CoroutineIOCompletion *co = opaque; > > co->ret = ret; > aio_context_acquire(co->ctx); > qemu_coroutine_enter(co->coroutine, NULL); > aio_context_release(co->ctx); > } > > ... > > acb = bs->drv->bdrv_aio_readv(bs, sector_num, iov, nb_sectors, > bdrv_co_io_em_complete, &co); > qemu_coroutine_yield(); > > bdrv_co_io_em_complete here can be called before the coroutine has > yielded. To prepare for the replacement of the AioContext mutex with > fine-grained mutexes, I think bdrv_co_io_em_complete should do something > like > > if (ctx != qemu_get_current_aio_context()) { > aio_co_schedule(ctx, co->coroutine); > return; > } > > aio_context_acquire(ctx); > qemu_coroutine_enter(co->coroutine, NULL); > aio_context_release(ctx);
Okay, that makes sense.
signature.asc
Description: PGP signature