diff options
author | Jan Kiszka <jan.kiszka@siemens.com> | 2009-11-30 18:21:20 +0100 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2009-12-03 10:48:52 -0600 |
commit | 575a58d763fa31ab34b8b943b452c0fdb9f37190 (patch) | |
tree | 507b4d7550a99d501102d4c24f13b1d53c95401a /block-migration.c | |
parent | c6d2283068026035a6468aae9dcde953bd7521ac (diff) |
block migration: Avoid large stack buffer
Move a potentially large buffer from stack to heap.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'block-migration.c')
-rw-r--r-- | block-migration.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/block-migration.c b/block-migration.c index 5aff5a7183..a0dcdadb20 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; } |