[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
- [Qemu-devel] [PATCH v5 00/22] block: Asynchronous request cancellation, Fam Zheng, 2014/09/10
- [Qemu-devel] [PATCH v5 01/22] ide/ahci: Check for -ECANCELED in aio callbacks, Fam Zheng, 2014/09/10
- [Qemu-devel] [PATCH v5 02/22] block: Add refcnt in BlockDriverAIOCB, Fam Zheng, 2014/09/10
- [Qemu-devel] [PATCH v5 03/22] block: Add bdrv_aio_cancel_async, Fam Zheng, 2014/09/10
- [Qemu-devel] [PATCH v5 04/22] block: Drop bdrv_em_co_aiocb_info.cancel, Fam Zheng, 2014/09/10
- [Qemu-devel] [PATCH v5 05/22] block: Convert bdrv_em_aiocb_info.cancel to .cancel_async, Fam Zheng, 2014/09/10
- [Qemu-devel] [PATCH v5 06/22] thread-pool: Convert thread_pool_aiocb_info.cancel to cancel_async, Fam Zheng, 2014/09/10
- [Qemu-devel] [PATCH v5 07/22] linux-aio: Convert laio_aiocb_info.cancel to .cancel_async, Fam Zheng, 2014/09/10
- [Qemu-devel] [PATCH v5 08/22] dma: Convert dma_aiocb_info.cancel to .cancel_async, Fam Zheng, 2014/09/10
- [Qemu-devel] [PATCH v5 09/22] iscsi: Convert iscsi_aiocb_info.cancel to .cancel_async, Fam Zheng, 2014/09/10
- [Qemu-devel] [PATCH v5 10/22] archipelago: Drop archipelago_aiocb_info.cancel, Fam Zheng, 2014/09/10
- [Qemu-devel] [PATCH v5 11/22] blkdebug: Drop blkdebug_aiocb_info.cancel, Fam Zheng, 2014/09/10
- [Qemu-devel] [PATCH v5 13/22] curl: Drop curl_aiocb_info.cancel, Fam Zheng, 2014/09/10
- [Qemu-devel] [PATCH v5 14/22] qed: Drop qed_aiocb_info.cancel, Fam Zheng, 2014/09/10
- [Qemu-devel] [PATCH v5 15/22] quorum: fix quorum_aio_cancel(), Fam Zheng, 2014/09/10
- [Qemu-devel] [PATCH v5 16/22] quorum: Convert quorum_aiocb_info.cancel to .cancel_async, Fam Zheng, 2014/09/10