On Fri, 02/20 17:26, Paolo Bonzini wrote: > This is the first step in pushing down acquire/release, and will let > rfifolock drop the contention callback feature. > > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> > --- > aio-posix.c | 9 +++++++++ > aio-win32.c | 8 ++++++++ > include/block/aio.h | 15 ++++++++------- > 3 files changed, 25 insertions(+), 7 deletions(-) > > diff --git a/aio-posix.c b/aio-posix.c > index 4a30b77..292ae84 100644 > --- a/aio-posix.c > +++ b/aio-posix.c > @@ -238,6 +238,7 @@ bool aio_poll(AioContext *ctx, bool blocking) > bool progress; > int64_t timeout; > > + aio_context_acquire(ctx); > was_dispatching = ctx->dispatching; > progress = false; > > @@ -267,7 +268,13 @@ bool aio_poll(AioContext *ctx, bool blocking) > timeout = blocking ? aio_compute_timeout(ctx) : 0; > > /* wait until next event */ > + if (timeout) { > + aio_context_release(ctx); > + } > ret = qemu_poll_ns((GPollFD *)pollfds, npfd, timeout); > + if (timeout) { > + aio_context_acquire(ctx); > + } > > /* if we have any readable fds, dispatch event */ > if (ret > 0) { > @@ -285,5 +292,7 @@ bool aio_poll(AioContext *ctx, bool blocking) > } > > aio_set_dispatching(ctx, was_dispatching); > + aio_context_release(ctx); > + > return progress; > } > diff --git a/aio-win32.c b/aio-win32.c > index e6f4ced..233d8f5 100644 > --- a/aio-win32.c > +++ b/aio-win32.c > @@ -283,6 +283,7 @@ bool aio_poll(AioContext *ctx, bool blocking) > int count; > int timeout; > > + aio_context_acquire(ctx); > have_select_revents = aio_prepare(ctx); > if (have_select_revents) { > blocking = false; > @@ -323,7 +324,13 @@ bool aio_poll(AioContext *ctx, bool blocking) > > timeout = blocking > ? qemu_timeout_ns_to_ms(aio_compute_timeout(ctx)) : 0; > + if (timeout) { > + aio_context_release(ctx);
Why are the unlock/lock pairs around poll conditional? Fam > + } > ret = WaitForMultipleObjects(count, events, FALSE, timeout); > + if (timeout) { > + aio_context_acquire(ctx); > + } > aio_set_dispatching(ctx, true); > > if (first && aio_bh_poll(ctx)) {