Re: [Qemu-devel] [PATCH 12/16] block: explicitly acquire aiocontext in bottom halves that need it

2017-01-18 Thread Stefan Hajnoczi
On Fri, Jan 13, 2017 at 02:17:27PM +0100, Paolo Bonzini wrote:
> Signed-off-by: Paolo Bonzini 
> ---
>  async.c   |  4 ++--
>  block/archipelago.c   |  3 +++
>  block/blkdebug.c  |  9 +
>  block/blkreplay.c |  2 +-
>  block/block-backend.c |  6 ++
>  block/curl.c  | 26 ++
>  block/gluster.c   |  9 +
>  block/io.c|  6 +-
>  block/iscsi.c |  6 +-
>  block/linux-aio.c | 15 +--
>  block/nfs.c   |  3 ++-
>  block/null.c  |  4 
>  block/qed.c   |  3 +++
>  block/rbd.c   |  4 
>  dma-helpers.c |  2 ++
>  hw/block/virtio-blk.c |  2 ++
>  hw/scsi/scsi-bus.c|  2 ++
>  thread-pool.c |  2 ++
>  18 files changed, 72 insertions(+), 36 deletions(-)

Reviewed-by: Stefan Hajnoczi 


signature.asc
Description: PGP signature


[Qemu-devel] [PATCH 12/16] block: explicitly acquire aiocontext in bottom halves that need it

2017-01-13 Thread Paolo Bonzini
Signed-off-by: Paolo Bonzini 
---
 async.c   |  4 ++--
 block/archipelago.c   |  3 +++
 block/blkdebug.c  |  9 +
 block/blkreplay.c |  2 +-
 block/block-backend.c |  6 ++
 block/curl.c  | 26 ++
 block/gluster.c   |  9 +
 block/io.c|  6 +-
 block/iscsi.c |  6 +-
 block/linux-aio.c | 15 +--
 block/nfs.c   |  3 ++-
 block/null.c  |  4 
 block/qed.c   |  3 +++
 block/rbd.c   |  4 
 dma-helpers.c |  2 ++
 hw/block/virtio-blk.c |  2 ++
 hw/scsi/scsi-bus.c|  2 ++
 thread-pool.c |  2 ++
 18 files changed, 72 insertions(+), 36 deletions(-)

diff --git a/async.c b/async.c
index ccb70e7..0243ca9 100644
--- a/async.c
+++ b/async.c
@@ -113,9 +113,7 @@ int aio_bh_poll(AioContext *ctx)
 ret = 1;
 }
 bh->idle = 0;
-aio_context_acquire(ctx);
 aio_bh_call(bh);
-aio_context_release(ctx);
 }
 if (bh->deleted) {
 deleted = true;
@@ -388,7 +386,9 @@ static void co_schedule_bh_cb(void *opaque)
 Coroutine *co = QSLIST_FIRST(&straight);
 QSLIST_REMOVE_HEAD(&straight, co_scheduled_next);
 trace_aio_co_schedule_bh_cb(ctx, co);
+aio_context_acquire(ctx);
 qemu_coroutine_enter(co);
+aio_context_release(ctx);
 }
 }
 
diff --git a/block/archipelago.c b/block/archipelago.c
index 2449cfc..a624390 100644
--- a/block/archipelago.c
+++ b/block/archipelago.c
@@ -310,8 +310,11 @@ static void qemu_archipelago_complete_aio(void *opaque)
 {
 AIORequestData *reqdata = (AIORequestData *) opaque;
 ArchipelagoAIOCB *aio_cb = (ArchipelagoAIOCB *) reqdata->aio_cb;
+AioContext *ctx = bdrv_get_aio_context(aio_cb->common.bs);
 
+aio_context_acquire(ctx);
 aio_cb->common.cb(aio_cb->common.opaque, aio_cb->ret);
+aio_context_release(ctx);
 aio_cb->status = 0;
 
 qemu_aio_unref(aio_cb);
diff --git a/block/blkdebug.c b/block/blkdebug.c
index acccf85..259369d 100644
--- a/block/blkdebug.c
+++ b/block/blkdebug.c
@@ -405,12 +405,6 @@ out:
 return ret;
 }
 
-static void error_callback_bh(void *opaque)
-{
-Coroutine *co = opaque;
-qemu_coroutine_enter(co);
-}
-
 static int inject_error(BlockDriverState *bs, BlkdebugRule *rule)
 {
 BDRVBlkdebugState *s = bs->opaque;
@@ -423,8 +417,7 @@ static int inject_error(BlockDriverState *bs, BlkdebugRule 
*rule)
 }
 
 if (!immediately) {
-aio_bh_schedule_oneshot(bdrv_get_aio_context(bs), error_callback_bh,
-qemu_coroutine_self());
+aio_co_schedule(bdrv_get_aio_context(bs), qemu_coroutine_self());
 qemu_coroutine_yield();
 }
 
diff --git a/block/blkreplay.c b/block/blkreplay.c
index a741654..cfc8c5b 100755
--- a/block/blkreplay.c
+++ b/block/blkreplay.c
@@ -60,7 +60,7 @@ static int64_t blkreplay_getlength(BlockDriverState *bs)
 static void blkreplay_bh_cb(void *opaque)
 {
 Request *req = opaque;
-qemu_coroutine_enter(req->co);
+aio_co_wake(req->co);
 qemu_bh_delete(req->bh);
 g_free(req);
 }
diff --git a/block/block-backend.c b/block/block-backend.c
index 1177598..bfc0e6b 100644
--- a/block/block-backend.c
+++ b/block/block-backend.c
@@ -939,9 +939,12 @@ int blk_make_zero(BlockBackend *blk, BdrvRequestFlags 
flags)
 static void error_callback_bh(void *opaque)
 {
 struct BlockBackendAIOCB *acb = opaque;
+AioContext *ctx = bdrv_get_aio_context(acb->common.bs);
 
 bdrv_dec_in_flight(acb->common.bs);
+aio_context_acquire(ctx);
 acb->common.cb(acb->common.opaque, acb->ret);
+aio_context_release(ctx);
 qemu_aio_unref(acb);
 }
 
@@ -983,9 +986,12 @@ static void blk_aio_complete(BlkAioEmAIOCB *acb)
 static void blk_aio_complete_bh(void *opaque)
 {
 BlkAioEmAIOCB *acb = opaque;
+AioContext *ctx = bdrv_get_aio_context(acb->common.bs);
 
 assert(acb->has_returned);
+aio_context_acquire(ctx);
 blk_aio_complete(acb);
+aio_context_release(ctx);
 }
 
 static BlockAIOCB *blk_aio_prwv(BlockBackend *blk, int64_t offset, int bytes,
diff --git a/block/curl.c b/block/curl.c
index 05b9ca3..f3f063b 100644
--- a/block/curl.c
+++ b/block/curl.c
@@ -796,13 +796,18 @@ static void curl_readv_bh_cb(void *p)
 {
 CURLState *state;
 int running;
+int ret = -EINPROGRESS;
 
 CURLAIOCB *acb = p;
-BDRVCURLState *s = acb->common.bs->opaque;
+BlockDriverState *bs = acb->common.bs;
+BDRVCURLState *s = bs->opaque;
+AioContext *ctx = bdrv_get_aio_context(bs);
 
 size_t start = acb->sector_num * BDRV_SECTOR_SIZE;
 size_t end;
 
+aio_context_acquire(ctx);
+
 // In case we have the requested data already (e.g. read-ahead),
 // we can just call the callback and be done.
 switch (curl_find_buf(s, start, acb->nb_sectors * BDRV_SECTOR_SIZE, acb)) {
@@ -810,7 +815,7 @@ static void curl_readv_bh_cb(void *p)