From patchwork Mon Apr 8 11:29:56 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Bonzini X-Patchwork-Id: 234742 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 B9A642C00E3 for ; Mon, 8 Apr 2013 21:30:43 +1000 (EST) Received: from localhost ([::1]:51214 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UPAHY-0007VK-6q for incoming@patchwork.ozlabs.org; Mon, 08 Apr 2013 07:30:40 -0400 Received: from eggs.gnu.org ([208.118.235.92]:46712) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UPAH8-0007TW-Qt for qemu-devel@nongnu.org; Mon, 08 Apr 2013 07:30:17 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UPAH2-0006c5-Js for qemu-devel@nongnu.org; Mon, 08 Apr 2013 07:30:14 -0400 Received: from mail-wi0-x22f.google.com ([2a00:1450:400c:c05::22f]:35219) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UPAH2-0006bb-AX for qemu-devel@nongnu.org; Mon, 08 Apr 2013 07:30:08 -0400 Received: by mail-wi0-f175.google.com with SMTP id c10so2425385wiw.14 for ; Mon, 08 Apr 2013 04:30:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:sender:from:to:cc:subject:date:message-id:x-mailer :in-reply-to:references; bh=hnObpMg4KDCWeC1lLHlG8H6ztEJey2Kw+EGIkem1NcU=; b=Gf5rE1SUnpvDYPrMKpMR8G5AD0M++eWbg+5HfgZUuBAniTRc/RYczhsVSAaDs8+xUi f6VNVtI6/orKU5FdwwQTIxjRcXct0HfXBvWXY4EWCMDGzqIIZthsy+8pX20uECR+PiuQ Flra0K/iz/EbtdXgQxn+WhXgJxCQ/baWrqLznwvzOpMWf8vN+VyAEExwntX9BrrJq58D oqTAe3/X4R5SceiB+yRrXkl7nDrPNb4BAFkW5UIjCBpNS0I3PgsocGsHwzLVrJuKlsxx lDZGMMDPAMGEOTltyYp9ahVZOA/TlJpRLrGFrSGNcLG7F2GwlURItWE0CAGNRVca53PF 6dvg== X-Received: by 10.180.74.67 with SMTP id r3mr12185534wiv.14.1365420607610; Mon, 08 Apr 2013 04:30:07 -0700 (PDT) Received: from playground.lan (93-34-176-20.ip50.fastwebnet.it. [93.34.176.20]) by mx.google.com with ESMTPS id h10sm21504167wic.8.2013.04.08.04.30.05 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Mon, 08 Apr 2013 04:30:06 -0700 (PDT) From: Paolo Bonzini To: qemu-devel@nongnu.org Date: Mon, 8 Apr 2013 13:29:56 +0200 Message-Id: <1365420597-5506-4-git-send-email-pbonzini@redhat.com> X-Mailer: git-send-email 1.8.1.4 In-Reply-To: <1365420597-5506-1-git-send-email-pbonzini@redhat.com> References: <1365420597-5506-1-git-send-email-pbonzini@redhat.com> X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2a00:1450:400c:c05::22f Cc: kwolf@redhat.com, owasserm@redhat.com, quintela@redhat.com Subject: [Qemu-devel] [PATCH 3/4] migration: drop is_write complications 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 The same QEMUFile is never used for both read and write. Simplify the logic to simply look for presence or absence of the right ops. Signed-off-by: Paolo Bonzini --- savevm.c | 68 +++++++++++++++++++--------------------------------------------- 1 file changed, 20 insertions(+), 48 deletions(-) diff --git a/savevm.c b/savevm.c index b32e0a7..a2f6bc0 100644 --- a/savevm.c +++ b/savevm.c @@ -119,7 +119,6 @@ void qemu_announce_self(void) struct QEMUFile { const QEMUFileOps *ops; void *opaque; - int is_write; int64_t bytes_xfer; int64_t xfer_limit; @@ -500,7 +499,6 @@ QEMUFile *qemu_fopen_ops(void *opaque, const QEMUFileOps *ops) f->opaque = opaque; f->ops = ops; - f->is_write = 0; return f; } @@ -516,6 +514,11 @@ static void qemu_file_set_error(QEMUFile *f, int ret) } } +static inline bool qemu_file_is_writable(QEMUFile *f) +{ + return f->ops->writev_buffer || f->ops->put_buffer; +} + /** * Flushes QEMUFile buffer * @@ -526,26 +529,24 @@ static void qemu_fflush(QEMUFile *f) { ssize_t ret = 0; - if (!f->ops->writev_buffer && !f->ops->put_buffer) { + if (!qemu_file_is_writable(f)) { return; } - if (f->is_write) { - if (f->ops->writev_buffer) { - if (f->iovcnt > 0) { - ret = f->ops->writev_buffer(f->opaque, f->iov, f->iovcnt); - } - } else { - if (f->buf_index > 0) { - ret = f->ops->put_buffer(f->opaque, f->buf, f->pos, f->buf_index); - } + if (f->ops->writev_buffer) { + if (f->iovcnt > 0) { + ret = f->ops->writev_buffer(f->opaque, f->iov, f->iovcnt); } - if (ret >= 0) { - f->pos += ret; + } else { + if (f->buf_index > 0) { + ret = f->ops->put_buffer(f->opaque, f->buf, f->pos, f->buf_index); } - f->buf_index = 0; - f->iovcnt = 0; } + if (ret >= 0) { + f->pos += ret; + } + f->buf_index = 0; + f->iovcnt = 0; if (ret < 0) { qemu_file_set_error(f, ret); } @@ -556,11 +557,7 @@ static void qemu_fill_buffer(QEMUFile *f) int len; int pending; - if (!f->ops->get_buffer) - return; - - if (f->is_write) - abort(); + assert(!qemu_file_is_writable(f)); pending = f->buf_size - f->buf_index; if (pending > 0) { @@ -629,7 +626,6 @@ static void add_to_iovec(QEMUFile *f, const uint8_t *buf, int size) f->iov[f->iovcnt++].iov_len = size; } - f->is_write = 1; if (f->buf_index >= IO_BUF_SIZE || f->iovcnt >= MAX_IOV_SIZE) { qemu_fflush(f); } @@ -646,12 +642,6 @@ void qemu_put_buffer_async(QEMUFile *f, const uint8_t *buf, int size) return; } - if (f->is_write == 0 && f->buf_index > 0) { - fprintf(stderr, - "Attempted to write to buffer while read buffer is not empty\n"); - abort(); - } - f->bytes_xfer += size; add_to_iovec(f, buf, size); } @@ -664,12 +654,6 @@ void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size) return; } - if (f->is_write == 0 && f->buf_index > 0) { - fprintf(stderr, - "Attempted to write to buffer while read buffer is not empty\n"); - abort(); - } - while (size > 0) { l = IO_BUF_SIZE - f->buf_index; if (l > size) @@ -680,7 +664,6 @@ void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size) add_to_iovec(f, f->buf + f->buf_index, l); f->buf_index += l; } else { - f->is_write = 1; f->buf_index += l; if (f->buf_index == IO_BUF_SIZE) { qemu_fflush(f); @@ -700,19 +683,12 @@ void qemu_put_byte(QEMUFile *f, int v) return; } - if (f->is_write == 0 && f->buf_index > 0) { - fprintf(stderr, - "Attempted to write to buffer while read buffer is not empty\n"); - abort(); - } - f->buf[f->buf_index] = v; f->bytes_xfer++; if (f->ops->writev_buffer) { add_to_iovec(f, f->buf + f->buf_index, 1); f->buf_index++; } else { - f->is_write = 1; f->buf_index++; if (f->buf_index == IO_BUF_SIZE) { qemu_fflush(f); @@ -732,9 +708,7 @@ static int qemu_peek_buffer(QEMUFile *f, uint8_t *buf, int size, size_t offset) int pending; int index; - if (f->is_write) { - abort(); - } + assert(!qemu_file_is_writable(f)); index = f->buf_index + offset; pending = f->buf_size - index; @@ -779,9 +753,7 @@ static int qemu_peek_byte(QEMUFile *f, int offset) { int index = f->buf_index + offset; - if (f->is_write) { - abort(); - } + assert(!qemu_file_is_writable(f)); if (index >= f->buf_size) { qemu_fill_buffer(f);