All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Marc-André Lureau" <marcandre.lureau@redhat.com>
To: qemu-devel@nongnu.org
Cc: pbonzini@redhat.com, "Marc-André Lureau" <marcandre.lureau@redhat.com>
Subject: [Qemu-devel] [PATCH] win32: fix main-loop busy loop on socket/fd event
Date: Wed,  4 Jan 2017 21:59:36 +0100	[thread overview]
Message-ID: <20170104205936.27279-1-marcandre.lureau@redhat.com> (raw)

Commit 05e514b1d4d5bd4209e2c8bbc76ff05c85a235f3 introduced an AIO
context optimization to avoid calling event_notifier_test_and_clear() on
ctx->notifier. On Windows, the same notifier is being used to wakeup the
wait on socket events (see commit
d3385eb448e38f828c78f8f68ec5d79c66a58b5d).

The ctx->notifier event is added to the gpoll sources in
aio_set_event_notifier(), aio_ctx_check() should clear the event
regardless of ctx->notified, since Windows sets the event by itself,
bypassing the aio->notified. This fixes qemu not clearing the event
resulting in a busy loop.

Paolo suggested to me on irc to call event_notifier_test_and_clear()
after select() >0 from aio-win32.c's aio_prepare. Unfortunately, not all
fds associated with ctx->notifiers are in AIO fd handlers set.
(qemu_set_nonblock() in util/oslib-win32.c calls qemu_fd_register()).

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 include/block/aio.h | 2 ++
 async.c             | 6 ++++++
 2 files changed, 8 insertions(+)

diff --git a/include/block/aio.h b/include/block/aio.h
index ca551e346f..a6da135bf3 100644
--- a/include/block/aio.h
+++ b/include/block/aio.h
@@ -100,6 +100,7 @@ struct AioContext {
      */
     int walking_bh;
 
+#ifndef _WIN32
     /* Used by aio_notify.
      *
      * "notified" is used to avoid expensive event_notifier_test_and_clear
@@ -113,6 +114,7 @@ struct AioContext {
      * in the docs/aio_notify_accept.promela formal model.
      */
     bool notified;
+#endif
     EventNotifier notifier;
 
     /* Thread pool for performing work and receiving completion callbacks */
diff --git a/async.c b/async.c
index b2de360c23..8c2a68b6cc 100644
--- a/async.c
+++ b/async.c
@@ -329,15 +329,21 @@ void aio_notify(AioContext *ctx)
     smp_mb();
     if (ctx->notify_me) {
         event_notifier_set(&ctx->notifier);
+#ifndef _WIN32
         atomic_mb_set(&ctx->notified, true);
+#endif
     }
 }
 
 void aio_notify_accept(AioContext *ctx)
 {
+#ifndef _WIN32
     if (atomic_xchg(&ctx->notified, false)) {
+#endif
         event_notifier_test_and_clear(&ctx->notifier);
+#ifndef _WIN32
     }
+#endif
 }
 
 static void aio_timerlist_notify(void *opaque)
-- 
2.11.0

             reply	other threads:[~2017-01-04 20:59 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-01-04 20:59 Marc-André Lureau [this message]
2017-01-04 21:19 ` [Qemu-devel] [PATCH] win32: fix main-loop busy loop on socket/fd event Paolo Bonzini
2017-01-04 21:39   ` Marc-André Lureau

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170104205936.27279-1-marcandre.lureau@redhat.com \
    --to=marcandre.lureau@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.