qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: Paolo Bonzini <pbonzini@redhat.com>
Subject: [Qemu-devel] [PULL 08/15] char: fix broken EAGAIN retry on OS-X due to errno clobbering
Date: Tue,  5 Apr 2016 11:50:11 +0200	[thread overview]
Message-ID: <1459849818-26649-9-git-send-email-pbonzini@redhat.com> (raw)
In-Reply-To: <1459849818-26649-1-git-send-email-pbonzini@redhat.com>

From: "Daniel P. Berrange" <berrange@redhat.com>

Some of the chardev I/O paths really want to write the
complete data buffer even though the channel is in
non-blocking mode. To achieve this they look for EAGAIN
and g_usleep() for 100ms. Unfortunately the code is set
to check errno == EAGAIN a second time, after the g_usleep()
call has completed. On OS-X at least, g_usleep clobbers
errno to ETIMEDOUT, causing the retry to be skipped.

This failure to retry means the full data isn't written
to the chardev backend, which causes various failures
including making the tests/ahci-test qtest hang.

Rather than playing games trying to reset errno just
simplify the code to use a goto to retry instead of a
a loop.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
Message-Id: <1459438168-8146-2-git-send-email-berrange@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 qemu-char.c | 36 ++++++++++++++++++------------------
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/qemu-char.c b/qemu-char.c
index 270819a..93fd733 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -225,12 +225,12 @@ static void qemu_chr_fe_write_log(CharDriverState *s,
     }
 
     while (done < len) {
-        do {
-            ret = write(s->logfd, buf + done, len - done);
-            if (ret == -1 && errno == EAGAIN) {
-                g_usleep(100);
-            }
-        } while (ret == -1 && errno == EAGAIN);
+    retry:
+        ret = write(s->logfd, buf + done, len - done);
+        if (ret == -1 && errno == EAGAIN) {
+            g_usleep(100);
+            goto retry;
+        }
 
         if (ret <= 0) {
             return;
@@ -246,12 +246,12 @@ static int qemu_chr_fe_write_buffer(CharDriverState *s, const uint8_t *buf, int
 
     qemu_mutex_lock(&s->chr_write_lock);
     while (*offset < len) {
-        do {
-            res = s->chr_write(s, buf + *offset, len - *offset);
-            if (res == -1 && errno == EAGAIN) {
-                g_usleep(100);
-            }
-        } while (res == -1 && errno == EAGAIN);
+    retry:
+        res = s->chr_write(s, buf + *offset, len - *offset);
+        if (res < 0 && errno == EAGAIN) {
+            g_usleep(100);
+            goto retry;
+        }
 
         if (res <= 0) {
             break;
@@ -333,12 +333,12 @@ int qemu_chr_fe_read_all(CharDriverState *s, uint8_t *buf, int len)
     }
 
     while (offset < len) {
-        do {
-            res = s->chr_sync_read(s, buf + offset, len - offset);
-            if (res == -1 && errno == EAGAIN) {
-                g_usleep(100);
-            }
-        } while (res == -1 && errno == EAGAIN);
+    retry:
+        res = s->chr_sync_read(s, buf + offset, len - offset);
+        if (res == -1 && errno == EAGAIN) {
+            g_usleep(100);
+            goto retry;
+        }
 
         if (res == 0) {
             break;
-- 
2.5.5

  parent reply	other threads:[~2016-04-05  9:50 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-05  9:50 [Qemu-devel] [PULL 00/15] Misc changes for QEMU 2.6.0-rc1 Paolo Bonzini
2016-04-05  9:50 ` [Qemu-devel] [PULL 01/15] update Linux headers to 4.6 Paolo Bonzini
2016-04-05  9:50 ` [Qemu-devel] [PULL 02/15] target-i386/kvm: Hyper-V VMBus hypercalls blank handlers Paolo Bonzini
2016-04-05  9:50 ` [Qemu-devel] [PULL 03/15] memory: fix segv on qemu_ram_free(block=0x0) Paolo Bonzini
2016-04-05  9:50 ` [Qemu-devel] [PULL 04/15] target-i386: do not pass MSR_TSC_AUX to KVM ioctls if CPUID bit is not set Paolo Bonzini
2016-04-05  9:50 ` [Qemu-devel] [PULL 05/15] target-i386: assert that KVM_GET/SET_MSRS can set all requested MSRs Paolo Bonzini
2016-04-05  9:50 ` [Qemu-devel] [PULL 06/15] checkpatch: add target_ulong to typelist Paolo Bonzini
2016-04-05  9:50 ` [Qemu-devel] [PULL 07/15] util: retry getaddrinfo if getting EAI_BADFLAGS with AI_V4MAPPED Paolo Bonzini
2016-04-05  9:50 ` Paolo Bonzini [this message]
2016-04-05  9:50 ` [Qemu-devel] [PULL 09/15] char: ensure all clients are in non-blocking mode Paolo Bonzini
2016-04-05  9:50 ` [Qemu-devel] [PULL 10/15] doc/memory: update MMIO section Paolo Bonzini
2016-04-05  9:59   ` Cao jin
2016-04-05 10:19     ` Paolo Bonzini
2016-04-05  9:50 ` [Qemu-devel] [PULL 11/15] nbd: don't request FUA on FLUSH Paolo Bonzini
2016-04-05  9:50 ` [Qemu-devel] [PULL 12/15] cpus: don't use atomic_read for vm_clock_warp_start Paolo Bonzini
2016-04-05  9:50 ` [Qemu-devel] [PULL 13/15] include/qemu/atomic: add compile time asserts Paolo Bonzini
2016-04-05  9:50 ` [Qemu-devel] [PULL 14/15] nbd: Fix poor debug message Paolo Bonzini
2016-04-05  9:50 ` [Qemu-devel] [PULL 15/15] net: fix missing include of qapi/error.h in netmap.c Paolo Bonzini
2016-04-05 10:53 ` [Qemu-devel] [PULL 00/15] Misc changes for QEMU 2.6.0-rc1 Peter Maydell

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=1459849818-26649-9-git-send-email-pbonzini@redhat.com \
    --to=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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).