From patchwork Tue Apr 5 09:50:11 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 8749281 Return-Path: X-Original-To: patchwork-qemu-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id CC43E9F36E for ; Tue, 5 Apr 2016 09:56:25 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 20D9F20268 for ; Tue, 5 Apr 2016 09:56:25 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 699DC20220 for ; Tue, 5 Apr 2016 09:56:23 +0000 (UTC) Received: from localhost ([::1]:35691 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1anNig-0005Nh-SI for patchwork-qemu-devel@patchwork.kernel.org; Tue, 05 Apr 2016 05:56:22 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54865) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1anNd5-0003ZM-Oq for qemu-devel@nongnu.org; Tue, 05 Apr 2016 05:50:36 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1anNd3-0001B1-E3 for qemu-devel@nongnu.org; Tue, 05 Apr 2016 05:50:35 -0400 Received: from mail-wm0-x241.google.com ([2a00:1450:400c:c09::241]:33286) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1anNd3-0001Ar-6p for qemu-devel@nongnu.org; Tue, 05 Apr 2016 05:50:33 -0400 Received: by mail-wm0-x241.google.com with SMTP id i204so2688754wmd.0 for ; Tue, 05 Apr 2016 02:50:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=sLcfFQ9vp+e1bZsp/NTQ0Tbb0+JG7GljEMfKlZBTSDo=; b=XRcmX5ZAqjmHwXCyHEuGoYO/ERRuwCIT+kcjDm2UOzVoPvi87giM/LdwvoKVKJjvIH EB9i+NXMl6yAZrAeqAgU/c333Z4wh+/6Rtud8ehuhhjm513kwp9LHmXHV70ckcjhRxyQ 1pk7D2Qqq5e7TXY+NxmXD/lgfAsIjjKL+vAXP3KYy/Em9SS6d3LV9rlkvXfncKfdUFmF 0diAvIMtv9x8RnHnROA0KsO1iFJgqxkxl6jURHTc2ZoM6iVq6rIzk4MzGHkJnlUFCCSP GTqEa2OZu/9kF3QnGVTephBU4WFXtVfPjn1y4BQ9WHisqiEnWaR2XIzRSS86H0Ur5Q5A NB0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=sLcfFQ9vp+e1bZsp/NTQ0Tbb0+JG7GljEMfKlZBTSDo=; b=Z0fALnWkAAq5Doss7+h7Fw3j/w8M0EY6qZnvLX6n6iCscRn1icB/TVU/BOBvATKaQe lLIC4lUmKLDcZnI0DCK7Yi1NXKidOiAkEtBg5psJv3Kj862T3QQjz51jb4Xdz4xAGWWF Xfj5Wi9RsSINlykZvucawKRARBF2Hf8G6AfevjOwp+bdSj/Jmngi1QSB64N+LALTInPc VE4ZXCebTqH1Gs1uB1Mr4ONyaLxfZBLijL44oxcmWHWB3iJcFEEMNAmSs9uWDwY89IeN rIT4IZWWnCS1LTisjF04G9WXhnSasrgo0ONfgoOxKgiMt6wwkLF+/4LpVRa0MupR039S hsoQ== X-Gm-Message-State: AD7BkJICybFIrRyXIvMj2P0mdIoGGVxczloNgG+wBHR6xEG7nE0NXfUkMatbddxCia7JtQ== X-Received: by 10.28.20.198 with SMTP id 189mr17001987wmu.103.1459849832554; Tue, 05 Apr 2016 02:50:32 -0700 (PDT) Received: from donizetti.lan (94-39-141-76.adsl-ull.clienti.tiscali.it. [94.39.141.76]) by smtp.gmail.com with ESMTPSA id ka4sm33721377wjc.47.2016.04.05.02.50.31 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 05 Apr 2016 02:50:31 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Tue, 5 Apr 2016 11:50:11 +0200 Message-Id: <1459849818-26649-9-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1459849818-26649-1-git-send-email-pbonzini@redhat.com> References: <1459849818-26649-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a00:1450:400c:c09::241 Cc: Paolo Bonzini Subject: [Qemu-devel] [PULL 08/15] char: fix broken EAGAIN retry on OS-X due to errno clobbering X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: "Daniel P. Berrange" 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 Message-Id: <1459438168-8146-2-git-send-email-berrange@redhat.com> Signed-off-by: Paolo Bonzini --- 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;