From 023bcb6edcb96da585b567024097c4a90484d88d Mon Sep 17 00:00:00 2001 From: Juan Quintela <quintela@redhat.com> Date: Mon, 22 Nov 2010 15:57:07 -0200 Subject: [PATCH 3/6] Fix transferred memory calculation RH-Author: Juan Quintela <quintela@redhat.com> Message-id: <31b3903c8c6fde022103f2c0fa196b68243e2015.1290441250.git.quintela@redhat.com> Patchwork-id: 13777 O-Subject: [PATCH 3/6] Fix transferred memory calculation Bugzilla: 513765 589017 RH-Acked-by: Jes Sorensen <Jes.Sorensen@redhat.com> RH-Acked-by: Alex Williamson <alex.williamson@redhat.com> RH-Acked-by: Avi Kivity <avi@redhat.com> Signed-off-by: Juan Quintela <quintela@redhat.com> --- qemu/vl.c | 16 ++++++++-------- 1 files changed, 8 insertions(+), 8 deletions(-) Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> --- qemu/vl.c | 16 ++++++++-------- 1 files changed, 8 insertions(+), 8 deletions(-) diff --git a/qemu/vl.c b/qemu/vl.c index 239a707..23fe8ff 100644 --- a/qemu/vl.c +++ b/qemu/vl.c @@ -3390,7 +3390,7 @@ static int ram_save_block(QEMUFile *f) static ram_addr_t current_addr = 0; ram_addr_t saved_addr = current_addr; ram_addr_t addr = 0; - int found = 0; + int bytes_sent = 0; while (addr < phys_ram_size) { if (kvm_enabled() && current_addr == 0) { @@ -3413,19 +3413,19 @@ static int ram_save_block(QEMUFile *f) if (is_dup_page(phys_ram_base + current_addr, ch)) { qemu_put_be64(f, current_addr | RAM_SAVE_FLAG_COMPRESS); qemu_put_byte(f, ch); + bytes_sent = 8 + 1; /* header + char */ } else { qemu_put_be64(f, current_addr | RAM_SAVE_FLAG_PAGE); qemu_put_buffer(f, phys_ram_base + current_addr, TARGET_PAGE_SIZE); + bytes_sent = 8 + TARGET_PAGE_SIZE; /* header + page size */ } - - found = 1; break; } addr += TARGET_PAGE_SIZE; current_addr = (saved_addr + addr) % phys_ram_size; } - return found; + return bytes_sent; } static uint64_t bytes_transferred = 0; @@ -3485,7 +3485,7 @@ static int ram_save_live(QEMUFile *f, int stage, void *opaque) int ret; ret = ram_save_block(f); - bytes_transferred += ret * TARGET_PAGE_SIZE; + bytes_transferred += ret; if (ret == 0) /* no more blocks */ break; } @@ -3501,15 +3501,15 @@ static int ram_save_live(QEMUFile *f, int stage, void *opaque) /* try transferring iterative blocks of memory */ if (stage == 3) { - int r; + int r, ret; if ((r = kvm_update_dirty_pages_log())) { printf("%s: update dirty pages log failed %d\n", __FUNCTION__, r); qemu_file_set_has_error(f); return 0; } /* flush all remaining blocks regardless of rate limiting */ - while (ram_save_block(f) != 0) { - bytes_transferred += TARGET_PAGE_SIZE; + while ((ret = ram_save_block(f)) != 0) { + bytes_transferred += ret; } cpu_physical_memory_set_dirty_tracking(0); } -- 1.7.3.2