qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v5 05/22] block: Convert bdrv_em_aiocb_info.canc


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [PATCH v5 05/22] block: Convert bdrv_em_aiocb_info.cancel to .cancel_async
Date: Wed, 10 Sep 2014 11:46:55 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.0

Il 10/09/2014 11:36, Fam Zheng ha scritto:
>> > 
>> > This could call the callback before I/O is finished.  I/O can then
>> > complete and write to disk stuff that was not meant to be written.
> I think the request is already completed when bdrv_aio_rw_vector returns this
> blockacb. I shouldn't override the return code anyway, but perhaps a nop
> bdrv_aio_cancel_em is better.

Note that the legacy bdrv_read/bdrv_write function calls actually are
AIO-friendly (they run in a coroutine, and can yield).

> > I think there is a pre-existing bug, which should be fixed with a "bool
> > *done" member similar to BlockDriverAIOCBCoroutine's.  But for the sake
> > of conversion to async cancellation, you can just empty bdrv_aio_cancel_em.
> 
> BTW, why is it "bool *done" instead of just "bool done"?

Because, until your patches to add reference counting, this would have
caused a dangling pointer in bdrv_aio_co_cancel_em:

    acb->done = true;
    qemu_bh_delete(acb->bh);
    qemu_aio_release(acb);

instead, using "bool *done" works because bdrv_co_em_bh writes into the
variable of bdrv_aio_co_cancel_em.  This assumes that bdrv_aio_cancel is
only called once (no reentrancy).

Paolo



reply via email to

[Prev in Thread] Current Thread [Next in Thread]