aio: introduce aio_co_schedule and aio_co_wake
aio_co_wake provides the infrastructure to start a coroutine on a "home" AioContext. It will be used by CoMutex and CoQueue, so that coroutines don't jump from one context to another when they go to sleep on a mutex or waitqueue. However, it can also be used as a more efficient alternative to one-shot bottom halves, and saves the effort of tracking which AioContext a coroutine is running on. aio_co_schedule is the part of aio_co_wake that starts a coroutine on a remove AioContext, but it is also useful to implement e.g. bdrv_set_aio_context callbacks. The implementation of aio_co_schedule is based on a lock-free multiple-producer, single-consumer queue. The multiple producers use cmpxchg to add to a LIFO stack. The consumer (a per-AioContext bottom half) grabs all items added so far, inverts the list to make it FIFO, and goes through it one item at a time until it's empty. The data structure was inspired by OSv, which uses it in the very code we'll "port" to QEMU for the thread-safe CoMutex. Most of the new code is really tests. Signed-off-by:Paolo Bonzini <pbonzini@redhat.com> Reviewed-by:
Fam Zheng <famz@redhat.com> Message-id: 20170213135235.12274-3-pbonzini@redhat.com Signed-off-by:
Stefan Hajnoczi <stefanha@redhat.com>
Showing
- include/block/aio.h 32 additions, 0 deletionsinclude/block/aio.h
- include/qemu/coroutine_int.h 10 additions, 1 deletioninclude/qemu/coroutine_int.h
- tests/Makefile.include 5 additions, 3 deletionstests/Makefile.include
- tests/iothread.c 91 additions, 0 deletionstests/iothread.c
- tests/iothread.h 25 additions, 0 deletionstests/iothread.h
- tests/test-aio-multithread.c 213 additions, 0 deletionstests/test-aio-multithread.c
- util/async.c 65 additions, 0 deletionsutil/async.c
- util/qemu-coroutine.c 8 additions, 0 deletionsutil/qemu-coroutine.c
- util/trace-events 4 additions, 0 deletionsutil/trace-events
Loading
Please register or sign in to comment