From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1NFTab-0003ID-32 for qemu-devel@nongnu.org; Tue, 01 Dec 2009 09:20:25 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1NFTaW-0003GM-Ti for qemu-devel@nongnu.org; Tue, 01 Dec 2009 09:20:24 -0500 Received: from [199.232.76.173] (port=56923 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1NFTaW-0003GG-PM for qemu-devel@nongnu.org; Tue, 01 Dec 2009 09:20:20 -0500 Received: from david.siemens.de ([192.35.17.14]:24428) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1NFTaW-0005eN-At for qemu-devel@nongnu.org; Tue, 01 Dec 2009 09:20:20 -0500 Message-ID: <4B152621.9020108@siemens.com> Date: Tue, 01 Dec 2009 15:20:17 +0100 From: Jan Kiszka MIME-Version: 1.0 References: <20091130172119.22889.28114.stgit@mchn012c.ww002.siemens.net> <20091130172121.22889.68041.stgit@mchn012c.ww002.siemens.net> In-Reply-To: <20091130172121.22889.68041.stgit@mchn012c.ww002.siemens.net> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [PATCH v2 22/23] block migration: Add support for restore progress reporting 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 Inject progress report in percentage into the block live stream. This can be read out and displayed easily on restore. Signed-off-by: Jan Kiszka --- Changes in v2: - Print banner only if there is really some block device to restore block-migration.c | 30 ++++++++++++++++++++++-------- 1 files changed, 22 insertions(+), 8 deletions(-) diff --git a/block-migration.c b/block-migration.c index 7510923..a066f19 100644 --- a/block-migration.c +++ b/block-migration.c @@ -23,6 +23,7 @@ #define BLK_MIG_FLAG_DEVICE_BLOCK 0x01 #define BLK_MIG_FLAG_EOS 0x02 +#define BLK_MIG_FLAG_PROGRESS 0x04 #define MAX_IS_ALLOCATED_SEARCH 65536 #define MAX_BLOCKS_READ 10000 @@ -70,7 +71,7 @@ typedef struct BlkMigState { int read_done; int transferred; int64_t total_sector_sum; - int64_t print_completion; + int prev_progress; } BlkMigState; static BlkMigState block_mig_state; @@ -226,7 +227,7 @@ static void init_blk_migration(Monitor *mon, QEMUFile *f) block_mig_state.read_done = 0; block_mig_state.transferred = 0; block_mig_state.total_sector_sum = 0; - block_mig_state.print_completion = 0; + block_mig_state.prev_progress = -1; for (bs = bdrv_first; bs != NULL; bs = bs->next) { if (bs->type == BDRV_TYPE_HD) { @@ -257,6 +258,7 @@ static int blk_mig_save_bulked_block(Monitor *mon, QEMUFile *f, int is_async) { int64_t completed_sector_sum = 0; BlkMigDevState *bmds; + int progress; int ret = 0; QSIMPLEQ_FOREACH(bmds, &block_mig_state.bmds_list, entry) { @@ -273,13 +275,13 @@ static int blk_mig_save_bulked_block(Monitor *mon, QEMUFile *f, int is_async) } } - if (completed_sector_sum >= block_mig_state.print_completion) { - monitor_printf(mon, "Completed %" PRId64 " %%\r", - completed_sector_sum * 100 / - block_mig_state.total_sector_sum); + progress = completed_sector_sum * 100 / block_mig_state.total_sector_sum; + if (progress != block_mig_state.prev_progress) { + block_mig_state.prev_progress = progress; + qemu_put_be64(f, (progress << BDRV_SECTOR_BITS) + | BLK_MIG_FLAG_PROGRESS); + monitor_printf(mon, "Completed %d %%\r", progress); monitor_flush(mon); - block_mig_state.print_completion += - (BDRV_SECTORS_PER_DIRTY_CHUNK * 10000); } return ret; @@ -445,6 +447,9 @@ static int block_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque) blk_mig_save_dirty_blocks(mon, f); blk_mig_cleanup(mon); + /* report completion */ + qemu_put_be64(f, (100 << BDRV_SECTOR_BITS) | BLK_MIG_FLAG_PROGRESS); + if (qemu_file_has_error(f)) { return 0; } @@ -459,6 +464,7 @@ static int block_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque) static int block_load(QEMUFile *f, void *opaque, int version_id) { + static int banner_printed; int len, flags; char device_name[256]; int64_t addr; @@ -490,6 +496,14 @@ static int block_load(QEMUFile *f, void *opaque, int version_id) bdrv_write(bs, addr, buf, BDRV_SECTORS_PER_DIRTY_CHUNK); qemu_free(buf); + } else if (flags & BLK_MIG_FLAG_PROGRESS) { + if (!banner_printed) { + printf("Receiving block device images\n"); + banner_printed = 1; + } + printf("Completed %d %%%c", (int)addr, + (addr == 100) ? '\n' : '\r'); + fflush(stdout); } else if (!(flags & BLK_MIG_FLAG_EOS)) { fprintf(stderr, "Unknown flags\n"); return -EINVAL;