[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-block] [PATCH v2 11/11] block: Block "device IO" during bdrv_d
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-block] [PATCH v2 11/11] block: Block "device IO" during bdrv_drain and bdrv_drain_all |
Date: |
Wed, 13 May 2015 12:26:53 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.5.0 |
On 13/05/2015 19:28, Fam Zheng wrote:
> We don't want new requests from guest, so block the operation around the
> nested poll.
>
> Signed-off-by: Fam Zheng <address@hidden>
> ---
> block/io.c | 12 ++++++++++++
> 1 file changed, 12 insertions(+)
>
> diff --git a/block/io.c b/block/io.c
> index 1ce62c4..d369de3 100644
> --- a/block/io.c
> +++ b/block/io.c
> @@ -289,9 +289,15 @@ static bool bdrv_drain_one(BlockDriverState *bs)
> */
> void bdrv_drain(BlockDriverState *bs)
> {
> + Error *blocker = NULL;
> +
> + error_setg(&blocker, "bdrv_drain in progress");
> + bdrv_op_block(bs, BLOCK_OP_TYPE_DEVICE_IO, blocker);
> while (bdrv_drain_one(bs)) {
> /* Keep iterating */
> }
> + bdrv_op_unblock(bs, BLOCK_OP_TYPE_DEVICE_IO, blocker);
> + error_free(blocker);
> }
>
> /*
> @@ -311,6 +317,9 @@ void bdrv_drain_all(void)
> /* Always run first iteration so any pending completion BHs run */
> bool busy = true;
> BlockDriverState *bs = NULL;
> + Error *blocker = NULL;
> +
> + error_setg(&blocker, "bdrv_drain_all in progress");
>
> while ((bs = bdrv_next(bs))) {
> AioContext *aio_context = bdrv_get_aio_context(bs);
> @@ -319,6 +328,7 @@ void bdrv_drain_all(void)
> if (bs->job) {
> block_job_pause(bs->job);
> }
> + bdrv_op_block(bs, BLOCK_OP_TYPE_DEVICE_IO, blocker);
> aio_context_release(aio_context);
> }
>
> @@ -343,8 +353,10 @@ void bdrv_drain_all(void)
> if (bs->job) {
> block_job_resume(bs->job);
> }
> + bdrv_op_unblock(bs, BLOCK_OP_TYPE_DEVICE_IO, blocker);
> aio_context_release(aio_context);
> }
> + error_free(blocker);
> }
>
> /**
>
I think this isn't enough. It's the callers of bdrv_drain and
bdrv_drain_all that need to block before drain and unblock before
aio_context_release.
Paolo
[Qemu-block] [PATCH v2 11/11] block: Block "device IO" during bdrv_drain and bdrv_drain_all, Fam Zheng, 2015/05/13
- Re: [Qemu-block] [PATCH v2 11/11] block: Block "device IO" during bdrv_drain and bdrv_drain_all,
Paolo Bonzini <=
- Re: [Qemu-block] [PATCH v2 11/11] block: Block "device IO" during bdrv_drain and bdrv_drain_all, Fam Zheng, 2015/05/13
- Re: [Qemu-block] [PATCH v2 11/11] block: Block "device IO" during bdrv_drain and bdrv_drain_all, Paolo Bonzini, 2015/05/13
- Re: [Qemu-block] [PATCH v2 11/11] block: Block "device IO" during bdrv_drain and bdrv_drain_all, Fam Zheng, 2015/05/13
- Re: [Qemu-block] [PATCH v2 11/11] block: Block "device IO" during bdrv_drain and bdrv_drain_all, Paolo Bonzini, 2015/05/13
- Re: [Qemu-block] [Qemu-devel] [PATCH v2 11/11] block: Block "device IO" during bdrv_drain and bdrv_drain_all, Fam Zheng, 2015/05/13