From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43408) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YiExZ-0005ix-69 for qemu-devel@nongnu.org; Wed, 15 Apr 2015 00:29:58 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YiExV-00019o-V8 for qemu-devel@nongnu.org; Wed, 15 Apr 2015 00:29:57 -0400 Received: from nat-gw1.syd4.anchor.net.au ([110.173.144.1]:35449 helo=bulkhead.engineroom.anchor.net.au) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YiExV-00015s-Km for qemu-devel@nongnu.org; Wed, 15 Apr 2015 00:29:53 -0400 From: Michael Chapman Date: Wed, 15 Apr 2015 13:59:14 +1000 Message-Id: <1429070355-19862-1-git-send-email-mike@very.puzzling.org> Subject: [Qemu-devel] [PATCH] migration: avoid divide by zero in xbzrle cache miss rate List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Amit Shah , Juan Quintela This bug manifested itself as a VM that could not be resumed by libvirt following a migration: # virsh resume example error: Failed to resume domain example error: internal error: cannot parse json {"return": {"xbzrle-cache": {..., "cache-miss-rate": -nan, ...}, ... } }: lexical error: malformed number, a digit is required after the minus sign. This patch also ensures xbzrle_cache_miss_prev and iterations_prev are cleared at the start of the migration. Signed-off-by: Michael Chapman --- arch_init.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/arch_init.c b/arch_init.c index 4c8fcee..ca45c7a 100644 --- a/arch_init.c +++ b/arch_init.c @@ -520,12 +520,16 @@ static void migration_bitmap_sync_range(ram_addr_t start, ram_addr_t length) static int64_t start_time; static int64_t bytes_xfer_prev; static int64_t num_dirty_pages_period; +static uint64_t xbzrle_cache_miss_prev; +static uint64_t iterations_prev; static void migration_bitmap_sync_init(void) { start_time = 0; bytes_xfer_prev = 0; num_dirty_pages_period = 0; + xbzrle_cache_miss_prev = 0; + iterations_prev = 0; } /* Called with iothread lock held, to protect ram_list.dirty_memory[] */ @@ -536,8 +540,6 @@ static void migration_bitmap_sync(void) MigrationState *s = migrate_get_current(); int64_t end_time; int64_t bytes_xfer_now; - static uint64_t xbzrle_cache_miss_prev; - static uint64_t iterations_prev; bitmap_sync_count++; @@ -585,7 +587,7 @@ static void migration_bitmap_sync(void) mig_throttle_on = false; } if (migrate_use_xbzrle()) { - if (iterations_prev != 0) { + if (iterations_prev != acct_info.iterations) { acct_info.xbzrle_cache_miss_rate = (double)(acct_info.xbzrle_cache_miss - xbzrle_cache_miss_prev) / -- 2.1.0