From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NFA2l-0003pM-0b for qemu-devel@nongnu.org; Mon, 30 Nov 2009 12:28:11 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NFA2Y-0003ic-Sy for qemu-devel@nongnu.org; Mon, 30 Nov 2009 12:28:03 -0500 Received: from [199.232.76.173] (port=36081 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NFA2X-0003i3-Rh for qemu-devel@nongnu.org; Mon, 30 Nov 2009 12:27:58 -0500 Received: from david.siemens.de ([192.35.17.14]:22226) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1NFA2W-0004fY-GH for qemu-devel@nongnu.org; Mon, 30 Nov 2009 12:27:57 -0500 Resent-To: Anthony Liguori Resent-Message-Id: <4B140096.3090106@siemens.com> From: Jan Kiszka Date: Mon, 30 Nov 2009 18:21:20 +0100 Message-ID: <20091130172120.22889.1661.stgit@mchn012c.ww002.siemens.net> In-Reply-To: <20091130172119.22889.28114.stgit@mchn012c.ww002.siemens.net> References: <20091130172119.22889.28114.stgit@mchn012c.ww002.siemens.net> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [PATCH 06/23] block migration: Avoid large stack buffer List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Anthony Liguori Cc: qemu-devel@nongnu.org, Liran Schour , Pierre Riteau Move a potentially large buffer from stack to heap. Signed-off-by: Jan Kiszka --- block-migration.c | 14 +++++++++----- 1 files changed, 9 insertions(+), 5 deletions(-) diff --git a/block-migration.c b/block-migration.c index 5aff5a7..a0dcdad 100644 --- a/block-migration.c +++ b/block-migration.c @@ -321,10 +321,12 @@ static int blk_mig_save_bulked_block(QEMUFile *f, int is_async) static void blk_mig_save_dirty_blocks(QEMUFile *f) { BlkMigDevState *bmds; - uint8_t buf[BLOCK_SIZE]; + uint8_t *buf; int64_t sector; int len; + buf = qemu_malloc(BLOCK_SIZE); + for (bmds = block_mig_state->bmds_first; bmds != NULL; bmds = bmds->next) { for (sector = 0; sector < bmds->cur_sector;) { if (bdrv_get_dirty(bmds->bs, sector)) { @@ -350,6 +352,8 @@ static void blk_mig_save_dirty_blocks(QEMUFile *f) sector += BDRV_SECTORS_PER_DIRTY_CHUNK; } } + + qemu_free(buf); } static void flush_blks(QEMUFile* f) @@ -458,8 +462,6 @@ static int block_load(QEMUFile *f, void *opaque, int version_id) BlockDriverState *bs; uint8_t *buf; - buf = qemu_malloc(BLOCK_SIZE); - do { addr = qemu_get_be64(f); @@ -475,6 +477,8 @@ static int block_load(QEMUFile *f, void *opaque, int version_id) bs = bdrv_find(device_name); + buf = qemu_malloc(BLOCK_SIZE); + qemu_get_buffer(f, buf, BLOCK_SIZE); if (bs != NULL) { bdrv_write(bs, addr, buf, BDRV_SECTORS_PER_DIRTY_CHUNK); @@ -482,14 +486,14 @@ static int block_load(QEMUFile *f, void *opaque, int version_id) printf("Error unknown block device %s\n", device_name); /* FIXME: add error handling */ } + + qemu_free(buf); } else if (!(flags & BLK_MIG_FLAG_EOS)) { printf("Unknown flags\n"); /* FIXME: add error handling */ } } while (!(flags & BLK_MIG_FLAG_EOS)); - qemu_free(buf); - return 0; }