From patchwork Mon Jun 4 09:57:19 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Isaku Yamahata X-Patchwork-Id: 162740 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 A13B1B6FC4 for ; Mon, 4 Jun 2012 21:18:36 +1000 (EST) Received: from localhost ([::1]:38802 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SbU43-0001WF-Ar for incoming@patchwork.ozlabs.org; Mon, 04 Jun 2012 05:59:07 -0400 Received: from eggs.gnu.org ([208.118.235.92]:50910) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SbU2u-0008Rc-Qa for qemu-devel@nongnu.org; Mon, 04 Jun 2012 05:58:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SbU2q-0004ce-Hm for qemu-devel@nongnu.org; Mon, 04 Jun 2012 05:57:56 -0400 Received: from mail.valinux.co.jp ([210.128.90.3]:46487) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SbU2q-0004aP-2p for qemu-devel@nongnu.org; Mon, 04 Jun 2012 05:57:52 -0400 Received: from ps.local.valinux.co.jp (vagw.valinux.co.jp [210.128.90.14]) by mail.valinux.co.jp (Postfix) with SMTP id 92D3F48988; Mon, 4 Jun 2012 18:57:45 +0900 (JST) Received: (nullmailer pid 5125 invoked by uid 1000); Mon, 04 Jun 2012 09:57:45 -0000 From: Isaku Yamahata To: qemu-devel@nongnu.org, kvm@vger.kernel.org Date: Mon, 4 Jun 2012 18:57:19 +0900 Message-Id: <100ef6241464f97e4459acf2dda78b5c20034d9e.1338802192.git.yamahata@valinux.co.jp> X-Mailer: git-send-email 1.7.1.1 In-Reply-To: References: In-Reply-To: References: X-Virus-Scanned: clamav-milter 0.95.2 at va-mail.local.valinux.co.jp X-Virus-Status: Clean X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-Received-From: 210.128.90.3 Cc: benoit.hudzia@gmail.com, aarcange@redhat.com, aliguori@us.ibm.com, quintela@redhat.com, stefanha@gmail.com, t.hirofuchi@aist.go.jp, dlaor@redhat.com, satoshi.itoh@aist.go.jp, mdroth@linux.vnet.ibm.com, yoshikawa.takuya@oss.ntt.co.jp, owasserm@redhat.com, avi@redhat.com, pbonzini@redhat.com Subject: [Qemu-devel] [PATCH v2 17/41] savevm, buffered_file: introduce method to drain buffer of buffered file 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 Introduce a new method to drain the buffer of QEMUBufferedFile. When postcopy migration, buffer size can increase unboundedly. To keep the buffer size reasonably small, introduce the method to wait for buffer to drain. Signed-off-by: Isaku Yamahata --- buffered_file.c | 20 +++++++++++++++----- buffered_file.h | 1 + qemu-file.h | 1 + savevm.c | 7 +++++++ 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/buffered_file.c b/buffered_file.c index f170aa0..a38caec 100644 --- a/buffered_file.c +++ b/buffered_file.c @@ -170,6 +170,15 @@ static int buffered_put_buffer(void *opaque, const uint8_t *buf, int64_t pos, in return offset; } +static void buffered_drain(QEMUFileBuffered *s) +{ + while (!qemu_file_get_error(s->file) && s->buffer_size) { + buffered_flush(s); + if (s->freeze_output) + s->wait_for_unfreeze(s->opaque); + } +} + static int buffered_close(void *opaque) { QEMUFileBuffered *s = opaque; @@ -177,11 +186,7 @@ static int buffered_close(void *opaque) DPRINTF("closing\n"); - while (!qemu_file_get_error(s->file) && s->buffer_size) { - buffered_flush(s); - if (s->freeze_output) - s->wait_for_unfreeze(s->opaque); - } + buffered_drain(s); ret = s->close(s->opaque); @@ -291,3 +296,8 @@ QEMUFile *qemu_fopen_ops_buffered(void *opaque, return s->file; } + +void qemu_buffered_file_drain_buffer(void *buffered_file) +{ + buffered_drain(buffered_file); +} diff --git a/buffered_file.h b/buffered_file.h index 98d358b..cd8e1e8 100644 --- a/buffered_file.h +++ b/buffered_file.h @@ -26,5 +26,6 @@ QEMUFile *qemu_fopen_ops_buffered(void *opaque, size_t xfer_limit, BufferedPutReadyFunc *put_ready, BufferedWaitForUnfreezeFunc *wait_for_unfreeze, BufferedCloseFunc *close); +void qemu_buffered_file_drain_buffer(void *buffered_file); #endif diff --git a/qemu-file.h b/qemu-file.h index 880ef4b..331ac8b 100644 --- a/qemu-file.h +++ b/qemu-file.h @@ -72,6 +72,7 @@ QEMUFile *qemu_popen(FILE *popen_file, const char *mode); QEMUFile *qemu_popen_cmd(const char *command, const char *mode); int qemu_stdio_fd(QEMUFile *f); void qemu_fflush(QEMUFile *f); +void qemu_buffered_file_drain(QEMUFile *f); int qemu_fclose(QEMUFile *f); void qemu_put_buffer(QEMUFile *f, const uint8_t *buf, int size); void qemu_put_byte(QEMUFile *f, int v); diff --git a/savevm.c b/savevm.c index 2992f97..fb47529 100644 --- a/savevm.c +++ b/savevm.c @@ -85,6 +85,7 @@ #include "cpus.h" #include "memory.h" #include "qmp-commands.h" +#include "buffered_file.h" #define SELF_ANNOUNCE_ROUNDS 5 @@ -477,6 +478,12 @@ void qemu_fflush(QEMUFile *f) } } +void qemu_buffered_file_drain(QEMUFile *f) +{ + qemu_fflush(f); + qemu_buffered_file_drain_buffer(f->opaque); +} + static void qemu_fill_buffer(QEMUFile *f) { int len;