qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 06/23] block migration: Avoid large stack buffer


From: Jan Kiszka
Subject: [Qemu-devel] [PATCH 06/23] block migration: Avoid large stack buffer
Date: Mon, 30 Nov 2009 18:21:20 +0100
User-agent: StGIT/0.14.3

Move a potentially large buffer from stack to heap.

Signed-off-by: Jan Kiszka <address@hidden>
---

 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;
 }
 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]