| Submitter | Paolo Bonzini |
|---|---|
| Date | Nov. 23, 2012, 2:59 p.m. |
| Message ID | <1353682783-25624-1-git-send-email-pbonzini@redhat.com> |
| Download | mbox | patch |
| Permalink | /patch/201336/ |
| State | New |
| Headers | show |
Comments
Paolo Bonzini <pbonzini@redhat.com> writes: > The repeated calls to WaitForMultipleObjects may cause a livelock in aio_poll, > where no progress is made on bottom halves. This patch matches the behavior > of the POSIX code. > > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> > --- > Found by the new unit tests. Applied. Thanks. Regards, Anthony Liguori > > aio-win32.c | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/aio-win32.c b/aio-win32.c > index a84eb71..cec4646 100644 > --- a/aio-win32.c > +++ b/aio-win32.c > @@ -173,7 +173,7 @@ bool aio_poll(AioContext *ctx, bool blocking) > } > > /* wait until next event */ > - for (;;) { > + while (count > 0) { > int timeout = blocking ? INFINITE : 0; > int ret = WaitForMultipleObjects(count, events, FALSE, timeout); > > @@ -209,6 +209,9 @@ bool aio_poll(AioContext *ctx, bool blocking) > g_free(tmp); > } > } > + > + /* Try again, but only call each handler once. */ > + events[ret - WAIT_OBJECT_0] = events[--count]; > } > > return progress; > -- > 1.8.0
Patch
diff --git a/aio-win32.c b/aio-win32.c index a84eb71..cec4646 100644 --- a/aio-win32.c +++ b/aio-win32.c @@ -173,7 +173,7 @@ bool aio_poll(AioContext *ctx, bool blocking) } /* wait until next event */ - for (;;) { + while (count > 0) { int timeout = blocking ? INFINITE : 0; int ret = WaitForMultipleObjects(count, events, FALSE, timeout); @@ -209,6 +209,9 @@ bool aio_poll(AioContext *ctx, bool blocking) g_free(tmp); } } + + /* Try again, but only call each handler once. */ + events[ret - WAIT_OBJECT_0] = events[--count]; } return progress;
The repeated calls to WaitForMultipleObjects may cause a livelock in aio_poll, where no progress is made on bottom halves. This patch matches the behavior of the POSIX code. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- Found by the new unit tests. aio-win32.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)