qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 02/16] aio: do not really acquire/release the main A


From: Paolo Bonzini
Subject: [Qemu-devel] [PATCH 02/16] aio: do not really acquire/release the main AIO context
Date: Tue, 9 Feb 2016 12:46:00 +0100

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 <address@hidden>
---
 async.c | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)

diff --git a/async.c b/async.c
index d4dd2cc..d083564 100644
--- a/async.c
+++ b/async.c
@@ -369,10 +369,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);
+    }
 }
-- 
2.5.0





reply via email to

[Prev in Thread] Current Thread [Next in Thread]