From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48876) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YqOwf-0005N0-V1 for qemu-devel@nongnu.org; Thu, 07 May 2015 12:46:46 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YqOwf-0005FQ-04 for qemu-devel@nongnu.org; Thu, 07 May 2015 12:46:45 -0400 Received: from mx1.redhat.com ([209.132.183.28]:57666) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YqOwe-0005FJ-Ob for qemu-devel@nongnu.org; Thu, 07 May 2015 12:46:44 -0400 From: Juan Quintela Date: Thu, 7 May 2015 18:46:15 +0200 Message-Id: <1431017176-3301-16-git-send-email-quintela@redhat.com> In-Reply-To: <1431017176-3301-1-git-send-email-quintela@redhat.com> References: <1431017176-3301-1-git-send-email-quintela@redhat.com> Subject: [Qemu-devel] [PULL 15/16] 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: Michael Chapman From: Michael Chapman 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 Reviewed-by: Amit Shah Signed-off-by: Juan Quintela --- arch_init.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/arch_init.c b/arch_init.c index 539011d..bbf0031 100644 --- a/arch_init.c +++ b/arch_init.c @@ -663,12 +663,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[] */ @@ -679,8 +683,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++; @@ -728,7 +730,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.4.0