On Sat, Feb 03, 2018 at 10:39:30AM -0500, Paolo Bonzini wrote: > There are cases in which a queued coroutine must be restarted from > non-coroutine context (with qemu_co_enter_next). In this cases, > qemu_co_enter_next also needs to be thread-safe, but it cannot use a > CoMutex and so cannot qemu_co_queue_wait. This happens in curl (which > right now is rolling its own list of Coroutines) and will happen in > Fam's NVMe driver as well. > > This series extracts the idea of a polymorphic lockable object > from my "scoped lock guard" proposal, and applies it to CoQueue. > The implementation of QemuLockable is similar to C11 _Generic, but > redone using the preprocessor and GCC builtins for compatibility. > > In general, while a bit on the esoteric side, the functionality used > to emulate _Generic is fairly old in GCC, and the builtins are already > used by include/qemu/atomic.h; the series was tested with Fedora 27 (boot > Damn Small Linux via http) and CentOS 6 (compiled only). > > Paolo > > v4->v5: fix checkpatch complaints > > v3->v4: fix -O0 compilation [Fam] > typos and copyright dates [Eric, Fam] > improve CoQueue comments [Stefan] > > Paolo Bonzini (5): > test-coroutine: add simple CoMutex test > lockable: add QemuLockable > coroutine-lock: convert CoQueue to use QemuLockable > coroutine-lock: make qemu_co_enter_next thread-safe > curl: convert to CoQueue > > block/curl.c | 20 ++-------- > fsdev/qemu-fsdev-throttle.c | 4 +- > include/qemu/compiler.h | 40 +++++++++++++++++++ > include/qemu/coroutine.h | 29 +++++++++----- > include/qemu/lockable.h | 96 > +++++++++++++++++++++++++++++++++++++++++++++ > include/qemu/thread.h | 5 +-- > include/qemu/typedefs.h | 4 ++ > tests/test-coroutine.c | 75 ++++++++++++++++++++++++++++++++++- > util/qemu-coroutine-lock.c | 22 +++++++---- > 9 files changed, 256 insertions(+), 39 deletions(-) > create mode 100644 include/qemu/lockable.h > > -- > 2.14.3 >
Reviewed-by: Stefan Hajnoczi <stefa...@redhat.com>
signature.asc
Description: PGP signature