From patchwork Tue Oct 2 11:33:11 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Juan Quintela X-Patchwork-Id: 188468 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 734A22C00A4 for ; Tue, 2 Oct 2012 21:52:37 +1000 (EST) Received: from localhost ([::1]:54096 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TJ0li-0000s1-QQ for incoming@patchwork.ozlabs.org; Tue, 02 Oct 2012 07:36:06 -0400 Received: from eggs.gnu.org ([208.118.235.92]:36896) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TJ0jm-00066F-84 for qemu-devel@nongnu.org; Tue, 02 Oct 2012 07:34:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TJ0jh-0007et-Vs for qemu-devel@nongnu.org; Tue, 02 Oct 2012 07:34:06 -0400 Received: from mx1.redhat.com ([209.132.183.28]:33433) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TJ0jh-0007em-NH for qemu-devel@nongnu.org; Tue, 02 Oct 2012 07:34:01 -0400 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q92BY0EQ019595 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Tue, 2 Oct 2012 07:34:01 -0400 Received: from trasno.mitica (ovpn-116-55.ams2.redhat.com [10.36.116.55]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q92BXbaj001633; Tue, 2 Oct 2012 07:33:59 -0400 From: Juan Quintela To: qemu-devel@nongnu.org Date: Tue, 2 Oct 2012 13:33:11 +0200 Message-Id: <1349177616-5341-17-git-send-email-quintela@redhat.com> In-Reply-To: <1349177616-5341-1-git-send-email-quintela@redhat.com> References: <1349177616-5341-1-git-send-email-quintela@redhat.com> X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.132.183.28 Cc: Paolo Bonzini Subject: [Qemu-devel] [PATCH 16/41] BufferedFile: append, then flush 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+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Paolo Bonzini Simplify the logic for pushing data from the buffer to the output pipe/socket. This also matches more closely what will be the operation of the migration thread. Signed-off-by: Paolo Bonzini Reviewed-by: Paolo Bonzini Reviewed-by: Orit Wasserman Signed-off-by: Juan Quintela --- buffered_file.c | 50 +++++++++++--------------------------------------- 1 file changed, 11 insertions(+), 39 deletions(-) diff --git a/buffered_file.c b/buffered_file.c index 4148abb..7155800 100644 --- a/buffered_file.c +++ b/buffered_file.c @@ -75,7 +75,7 @@ static void buffered_flush(QEMUFileBuffered *s) DPRINTF("flushing %zu byte(s) of data\n", s->buffer_size); - while (offset < s->buffer_size) { + while (s->bytes_xfer < s->xfer_limit && offset < s->buffer_size) { ssize_t ret; ret = s->put_buffer(s->opaque, s->buffer + offset, @@ -93,6 +93,7 @@ static void buffered_flush(QEMUFileBuffered *s) } else { DPRINTF("flushed %zd byte(s)\n", ret); offset += ret; + s->bytes_xfer += ret; } } @@ -104,8 +105,7 @@ static void buffered_flush(QEMUFileBuffered *s) static int buffered_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, int size) { QEMUFileBuffered *s = opaque; - int offset = 0, error; - ssize_t ret; + int error; DPRINTF("putting %d bytes at %" PRId64 "\n", size, pos); @@ -118,48 +118,22 @@ static int buffered_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, in DPRINTF("unfreezing output\n"); s->freeze_output = 0; - buffered_flush(s); - - while (!s->freeze_output && offset < size) { - if (s->bytes_xfer > s->xfer_limit) { - DPRINTF("transfer limit exceeded when putting\n"); - break; - } - - ret = s->put_buffer(s->opaque, buf + offset, size - offset); - if (ret == -EAGAIN) { - DPRINTF("backend not ready, freezing\n"); - s->freeze_output = 1; - break; - } - - if (ret <= 0) { - DPRINTF("error putting\n"); - qemu_file_set_error(s->file, ret); - offset = -EINVAL; - break; - } - - DPRINTF("put %zd byte(s)\n", ret); - offset += ret; - s->bytes_xfer += ret; - } - - if (offset >= 0) { + if (size > 0) { DPRINTF("buffering %d bytes\n", size - offset); - buffered_append(s, buf + offset, size - offset); - offset = size; + buffered_append(s, buf, size); } + buffered_flush(s); + if (pos == 0 && size == 0) { DPRINTF("file is ready\n"); - if (s->bytes_xfer <= s->xfer_limit) { + if (!s->freeze_output && s->bytes_xfer < s->xfer_limit) { DPRINTF("notifying client\n"); s->put_ready(s->opaque); } } - return offset; + return size; } static int buffered_close(void *opaque) @@ -169,6 +143,7 @@ static int buffered_close(void *opaque) DPRINTF("closing\n"); + s->xfer_limit = INT_MAX; while (!qemu_file_get_error(s->file) && s->buffer_size) { buffered_flush(s); if (s->freeze_output) @@ -248,10 +223,7 @@ static void buffered_rate_tick(void *opaque) s->bytes_xfer = 0; - buffered_flush(s); - - /* Add some checks around this */ - s->put_ready(s->opaque); + buffered_put_buffer(s, NULL, 0, 0); } QEMUFile *qemu_fopen_ops_buffered(void *opaque,