[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 33/39] threadpool: do not take lock in event_noti
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH v2 33/39] threadpool: do not take lock in event_notifier_ready |
Date: |
Wed, 31 Oct 2012 16:30:50 +0100 |
The ordering is:
worker thread consumer thread
-------------------------------------------------------------------
write ret event_notifier_test_and_clear
wmb() read state
write state rmb()
event_notifier_set read ret
Signed-off-by: Paolo Bonzini <address@hidden>
---
New patch.
thread-pool.c | 19 +++++++++++++------
1 file modificato, 13 inserzioni(+), 6 rimozioni(-)
diff --git a/thread-pool.c b/thread-pool.c
index 80749b7..651b324 100644
--- a/thread-pool.c
+++ b/thread-pool.c
@@ -39,6 +39,11 @@ struct ThreadPoolElement {
BlockDriverAIOCB common;
ThreadPoolFunc *func;
void *arg;
+
+ /* Moving state out of THREAD_QUEUED is protected by lock. After
+ * that, only the worker thread can write to it. Reads and writes
+ * of state and ret are ordered with memory barriers.
+ */
enum ThreadState state;
int ret;
@@ -95,9 +100,12 @@ static void *worker_thread(void *unused)
ret = req->func(req->arg);
- qemu_mutex_lock(&lock);
- req->state = THREAD_DONE;
req->ret = ret;
+ /* Write ret before state. */
+ smp_wmb();
+ req->state = THREAD_DONE;
+
+ qemu_mutex_lock(&lock);
if (pending_cancellations) {
qemu_cond_broadcast(&check_cancel);
}
@@ -162,11 +170,10 @@ restart:
trace_thread_pool_complete(elem, elem->common.opaque, elem->ret);
}
if (elem->state == THREAD_DONE && elem->common.cb) {
- qemu_mutex_lock(&lock);
- int ret = elem->ret;
- qemu_mutex_unlock(&lock);
QLIST_REMOVE(elem, all);
- elem->common.cb(elem->common.opaque, ret);
+ /* Read state before ret. */
+ smp_rmb();
+ elem->common.cb(elem->common.opaque, elem->ret);
qemu_aio_release(elem);
goto restart;
} else {
--
1.7.12.1
- [Qemu-devel] [PATCH v2 12/39] build: do not include main loop where it is not actually used, (continued)
- [Qemu-devel] [PATCH v2 12/39] build: do not include main loop where it is not actually used, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 17/39] aio: provide platform-independent API, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 20/39] aio: test node->deleted before calling io_flush, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 21/39] aio: add non-blocking variant of aio_wait, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 23/39] aio: add Win32 implementation, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 22/39] aio: prepare for introducing GSource-based dispatch, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 25/39] aio: add aio_notify, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 24/39] aio: make AioContexts GSources, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 27/39] main-loop: use GSource to poll AIO file descriptors, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 29/39] aio: clean up now-unused functions, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 33/39] threadpool: do not take lock in event_notifier_ready,
Paolo Bonzini <=
- [Qemu-devel] [PATCH v2 32/39] aio: add generic thread-pool facility, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 34/39] block: switch posix-aio-compat to threadpool, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 35/39] raw: merge posix-aio-compat.c into block/raw-posix.c, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 36/39] raw-posix: rename raw-posix-aio.h, hide unavailable prototypes, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 37/39] raw-win32: add emulated AIO support, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 30/39] linux-aio: use event notifiers, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 14/39] event_notifier: enable it to use pipes, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 15/39] vl: init main loop earlier, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 31/39] qemu-thread: add QemuSemaphore, Paolo Bonzini, 2012/10/31
- [Qemu-devel] [PATCH v2 13/39] event_notifier: add Win32 implementation, Paolo Bonzini, 2012/10/31