On Fri, 03/13 09:13, Paolo Bonzini wrote: > > > On 13/03/2015 02:38, Fam Zheng wrote: > > That if the dbs' owner is an iothread, dma should be resumed on the right > > thread. In this case it is the AioContext of the block device. > > > > Signed-off-by: Fam Zheng <f...@redhat.com> > > --- > > dma-helpers.c | 4 +++- > > 1 file changed, 3 insertions(+), 1 deletion(-) > > > > diff --git a/dma-helpers.c b/dma-helpers.c > > index 6918572..84f61a7 100644 > > --- a/dma-helpers.c > > +++ b/dma-helpers.c > > @@ -95,8 +95,10 @@ static void reschedule_dma(void *opaque) > > static void continue_after_map_failure(void *opaque) > > { > > DMAAIOCB *dbs = (DMAAIOCB *)opaque; > > + AioContext *ctx; > > > > - dbs->bh = qemu_bh_new(reschedule_dma, dbs); > > + ctx = blk_get_aio_context(dbs->blk); > > + dbs->bh = aio_bh_new(ctx, reschedule_dma, dbs); > > qemu_bh_schedule(dbs->bh); > > } > > > > > > This looks good. However, I wonder if dma_aio_cancel should also call > cpu_unregister_map_client. In this case, it's much better to just use a > lock for the list (though you can still use atomics for the in-use flag).
The other possibility is grab a reference for the cpu_register_map_client call, and release it in reschedule_dma. This way the atomics can keep, but we'll need a "finished" flag in DMAAIOCB to avoid double completion. Fam