From: Paolo Bonzini <pbonzini@redhat.com>
To: Fabien Chouteau <chouteau@adacore.com>
Cc: blauwirbel@gmail.com, sw@weilnetz.de, aliguori@us.ibm.com,
qemu-devel@nongnu.org, mdroth@linux.vnet.ibm.com
Subject: Re: [Qemu-devel] [PATCH] Check return values from g_poll and select
Date: Wed, 09 Jan 2013 10:37:58 +0100 [thread overview]
Message-ID: <50ED3A76.6030503@redhat.com> (raw)
In-Reply-To: <1357659056-2027-1-git-send-email-chouteau@adacore.com>
Il 08/01/2013 16:30, Fabien Chouteau ha scritto:
> The current implementation of os_host_main_loop_wait() on Windows,
> returns 1 only when a g_poll() event occurs because the return value of
> select() is overridden. This is wrong as we may skip a socket event, as
> shown in this example:
>
> 1. select() returns 0
> 2. g_poll() returns 1 (socket event occurs)
> 3. os_host_main_loop_wait() returns 1
> 4. qemu_iohandler_poll() sees no socket event because select() has
> return before the event occurs
> 5. select() returns 1
> 6. g_poll() returns 0 (g_poll overrides select's return value)
> 7. os_host_main_loop_wait() returns 0
> 8. qemu_iohandler_poll() doesn't check for socket events because the
> return value of os_host_main_loop_wait() is zero.
> 9. goto 5
>
> This patch use one variable for each of these return values, so we don't
> miss a select() event anymore.
>
> Also move the call to select() after g_poll(), this will improve latency
> as we don't have to go through two os_host_main_loop_wait() calls to
> detect a socket event.
>
> Signed-off-by: Fabien Chouteau <chouteau@adacore.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Paolo
> ---
> main-loop.c | 27 +++++++++++++--------------
> 1 file changed, 13 insertions(+), 14 deletions(-)
>
> diff --git a/main-loop.c b/main-loop.c
> index 54f38ae..6f52ac3 100644
> --- a/main-loop.c
> +++ b/main-loop.c
> @@ -330,7 +330,7 @@ void qemu_fd_register(int fd)
> static int os_host_main_loop_wait(uint32_t timeout)
> {
> GMainContext *context = g_main_context_default();
> - int ret, i;
> + int select_ret, g_poll_ret, ret, i;
> PollingEntry *pe;
> WaitObjects *w = &wait_objects;
> gint poll_timeout;
> @@ -345,13 +345,6 @@ static int os_host_main_loop_wait(uint32_t timeout)
> return ret;
> }
>
> - if (nfds >= 0) {
> - ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv0);
> - if (ret != 0) {
> - timeout = 0;
> - }
> - }
> -
> g_main_context_prepare(context, &max_priority);
> n_poll_fds = g_main_context_query(context, max_priority, &poll_timeout,
> poll_fds, ARRAY_SIZE(poll_fds));
> @@ -367,9 +360,9 @@ static int os_host_main_loop_wait(uint32_t timeout)
> }
>
> qemu_mutex_unlock_iothread();
> - ret = g_poll(poll_fds, n_poll_fds + w->num, poll_timeout);
> + g_poll_ret = g_poll(poll_fds, n_poll_fds + w->num, poll_timeout);
> qemu_mutex_lock_iothread();
> - if (ret > 0) {
> + if (g_poll_ret > 0) {
> for (i = 0; i < w->num; i++) {
> w->revents[i] = poll_fds[n_poll_fds + i].revents;
> }
> @@ -384,12 +377,18 @@ static int os_host_main_loop_wait(uint32_t timeout)
> g_main_context_dispatch(context);
> }
>
> - /* If an edge-triggered socket event occurred, select will return a
> - * positive result on the next iteration. We do not need to do anything
> - * here.
> + /* Call select after g_poll to avoid a useless iteration and therefore
> + * improve socket latency.
> */
>
> - return ret;
> + if (nfds >= 0) {
> + select_ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv0);
> + if (select_ret != 0) {
> + timeout = 0;
> + }
> + }
> +
> + return select_ret || g_poll_ret;
> }
> #endif
>
>
next prev parent reply other threads:[~2013-01-09 9:38 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-08 15:30 [Qemu-devel] [PATCH] Check return values from g_poll and select Fabien Chouteau
2013-01-09 9:37 ` Paolo Bonzini [this message]
2013-01-10 20:57 ` Anthony Liguori
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=50ED3A76.6030503@redhat.com \
--to=pbonzini@redhat.com \
--cc=aliguori@us.ibm.com \
--cc=blauwirbel@gmail.com \
--cc=chouteau@adacore.com \
--cc=mdroth@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=sw@weilnetz.de \
/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.