[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [Qemu-block] [PATCH 09/17] mirror: Lock AioContext in m
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [Qemu-block] [PATCH 09/17] mirror: Lock AioContext in mirror_co_perform() |
Date: |
Mon, 13 Aug 2018 16:43:26 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 |
On 13/08/2018 04:19, Max Reitz wrote:
> Signed-off-by: Max Reitz <address@hidden>
Locking AioContext should not be needed anywhere here. mirror_run is
called via aio_co_enter or aio_co_wake, so the lock is actually already
taken every time you call aio_context_acquire.
It was needed only because AIO callbacks do *not* take the lock, but
it's not needed anymore since the conversion to coroutines.
Paolo
> block/mirror.c | 13 ++++++++-----
> 1 file changed, 8 insertions(+), 5 deletions(-)
>
> diff --git a/block/mirror.c b/block/mirror.c
> index 85b08086cc..6330269156 100644
> --- a/block/mirror.c
> +++ b/block/mirror.c
> @@ -196,7 +196,6 @@ static void coroutine_fn mirror_write_complete(MirrorOp
> *op, int ret)
> {
> MirrorBlockJob *s = op->s;
>
> - aio_context_acquire(blk_get_aio_context(s->common.blk));
> if (ret < 0) {
> BlockErrorAction action;
>
> @@ -207,14 +206,12 @@ static void coroutine_fn mirror_write_complete(MirrorOp
> *op, int ret)
> }
> }
> mirror_iteration_done(op, ret);
> - aio_context_release(blk_get_aio_context(s->common.blk));
> }
>
> static void coroutine_fn mirror_read_complete(MirrorOp *op, int ret)
> {
> MirrorBlockJob *s = op->s;
>
> - aio_context_acquire(blk_get_aio_context(s->common.blk));
> if (ret < 0) {
> BlockErrorAction action;
>
> @@ -230,7 +227,6 @@ static void coroutine_fn mirror_read_complete(MirrorOp
> *op, int ret)
> op->qiov.size, &op->qiov, 0);
> mirror_write_complete(op, ret);
> }
> - aio_context_release(blk_get_aio_context(s->common.blk));
> }
>
> /* Clip bytes relative to offset to not exceed end-of-file */
> @@ -387,12 +383,16 @@ static void coroutine_fn mirror_co_perform(void *opaque)
> {
> MirrorOp *op = opaque;
> MirrorBlockJob *s = op->s;
> + AioContext *aio_context;
> int ret;
>
> + aio_context = blk_get_aio_context(s->common.blk);
> + aio_context_acquire(aio_context);
> +
> switch (op->mirror_method) {
> case MIRROR_METHOD_COPY:
> mirror_co_read(opaque);
> - return;
> + goto done;
> case MIRROR_METHOD_ZERO:
> ret = mirror_co_zero(s, op->offset, op->bytes);
> break;
> @@ -404,6 +404,9 @@ static void coroutine_fn mirror_co_perform(void *opaque)
> }
>
> mirror_write_complete(op, ret);
> +
> +done:
> + aio_context_release(aio_context);
> }
>
> /* If mirror_method == MIRROR_METHOD_COPY, *offset and *bytes will be
>
- [Qemu-devel] [PATCH 02/17] mirror: Make wait_for_any_operation() coroutine_fn, (continued)
- [Qemu-devel] [PATCH 02/17] mirror: Make wait_for_any_operation() coroutine_fn, Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 03/17] mirror: Pull *_align_for_copy() from *_co_read(), Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 04/17] mirror: Remove bytes_handled, part 1, Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 06/17] mirror: Create mirror_co_perform(), Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 05/17] mirror: Remove bytes_handled, part 2, Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 07/17] mirror: Make mirror_co_zero() nicer, Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 08/17] mirror: Make mirror_co_discard() nicer, Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 09/17] mirror: Lock AioContext in mirror_co_perform(), Max Reitz, 2018/08/12
- Re: [Qemu-devel] [Qemu-block] [PATCH 09/17] mirror: Lock AioContext in mirror_co_perform(),
Paolo Bonzini <=
- [Qemu-devel] [PATCH 10/17] mirror: Create mirror_co_alloc_qiov(), Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 11/17] mirror: Inline mirror_write_complete(), part 1, Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 12/17] mirror: Put QIOV locally into mirror_co_read, Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 13/17] mirror: Linearize mirror_co_read(), Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 14/17] mirror: Inline mirror_iteration_done(), Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 15/17] mirror: Release AioCtx before queue_restart_all(), Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 17/17] iotests: Add test for active mirror with COR, Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 16/17] mirror: Support COR with write-blocking, Max Reitz, 2018/08/12