diff mbox

[02/16] aio: do not really acquire/release the main AIO context

Message ID 1452870739-28484-3-git-send-email-pbonzini@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Paolo Bonzini Jan. 15, 2016, 3:12 p.m. UTC
The main AIO context is used in many places that are not aware
of AioContexts at all.  bdrv_drain will soon do a release/acquire
itself, which for the main AIO context would break because code
calls bdrv_drain on it without acquiring anything.

Very soon, bdrv will be ready for removal of aio_context_acquire
from non-block-layer code.  The idea is that the AioContext will be
acquired by bdrv_*, and no one will care of what's running in the
main I/O thread or in the dataplane thread.  Even if there are two
concurrent instances of the I/O thread, locks protect the data
structures; this evolves naturally to the multiqueue case where
there are multiple I/O threads touching the same BlockDriverState.

When this happens, aio_context_acquire/release can go away, replaced
by fine-grained locks, and this hack will also go away with it.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
 async.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)
diff mbox


diff --git a/async.c b/async.c
index e106072..b3efd3c 100644
--- a/async.c
+++ b/async.c
@@ -368,10 +368,18 @@  void aio_context_unref(AioContext *ctx)
 void aio_context_acquire(AioContext *ctx)
-    rfifolock_lock(&ctx->lock);
+    if (ctx == qemu_get_aio_context()) {
+        assert(qemu_mutex_iothread_locked());
+    } else {
+        rfifolock_lock(&ctx->lock);
+    }
 void aio_context_release(AioContext *ctx)
-    rfifolock_unlock(&ctx->lock);
+    if (ctx == qemu_get_aio_context()) {
+        assert(qemu_mutex_iothread_locked());
+    } else {
+        rfifolock_unlock(&ctx->lock);
+    }