This is the first step of pushing down the AioContext lock. Bottom halves are already protected by their own lock, use it also for walking_bh and for the handlers list (including walking_handlers). The (lock, walking_foo) pair is wrapped into the QemuLockCnt primitive.
The only difference from v3 is a smattering of tiny nice improvements to QemuLockCnt. Paolo v4->v5: remove stray tabs [patchew] v3->v4: Avoid useless atomic_mb_read in non-futex lockcnt [Stefan] Use atomic_read in qemu_lockcnt_count [Stefan] Tweak comment for qemu_lockcnt_cmpxchg_or_wait [Fam] Use if/else in qemu_lockcnt_dec_and_lock [Fam] Comment QEMU_LOCKCNT_STATE_* definitions [Fam] v2->v3: fix missing unlock v1->v2: rebased on top of polling patches moved documentation to include/ new patch "aio-posix: split aio_dispatch_handlers out of aio_dispatch" replaced atomic_read with atomic_mb_read in qemu_lockcnt_inc replaced futex* function and macro names with qemu_futex* removed atomic access to node->pfd.revents (because there is no concurrent aio_poll anymore after the BDRV_POLL_WHILE series) left "aio: push aio_context_acquire/release down to dispatching" to a later series Paolo Bonzini (10): aio: rename bh_lock to list_lock qemu-thread: introduce QemuLockCnt aio: make ctx->list_lock a QemuLockCnt, subsuming ctx->walking_bh qemu-thread: optimize QemuLockCnt with futexes on Linux aio-posix: split aio_dispatch_handlers out of aio_dispatch aio: tweak walking in dispatch phase aio-posix: remove walking_handlers, protecting AioHandler list with list_lock aio-win32: remove walking_handlers, protecting AioHandler list with list_lock aio: document locking async: optimize aio_bh_poll aio-posix.c | 116 +++++++------ aio-win32.c | 83 +++++---- async.c | 45 ++--- docs/lockcnt.txt | 277 +++++++++++++++++++++++++++++++ docs/multiple-iothreads.txt | 13 +- include/block/aio.h | 38 ++--- include/qemu/futex.h | 36 ++++ include/qemu/thread.h | 112 +++++++++++++ util/Makefile.objs | 1 + util/lockcnt.c | 397 ++++++++++++++++++++++++++++++++++++++++++++ util/qemu-thread-posix.c | 35 +--- util/qemu-thread-win32.c | 2 +- util/trace-events | 10 ++ 13 files changed, 1006 insertions(+), 159 deletions(-) create mode 100644 docs/lockcnt.txt create mode 100644 include/qemu/futex.h create mode 100644 util/lockcnt.c -- 2.9.3