From a725ef9fe36424351faf51696c3fc441ded13f35 Mon Sep 17 00:00:00 2001 From: Peter Xu Date: Tue, 10 Jul 2018 17:18:55 +0800 Subject: migration: fix incorrect bitmap size calculation The calculation on size of received bitmap is incorrect for postcopy recovery. Here we wanted to let the size to cover all the valid bits in the bitmap, we should use DIV_ROUND_UP() instead of a division. For example, a RAMBlock with size=4K (which contains only one single 4K page) will have nbits=1, then nbits/8=0, then the real bitmap won't be sent to source at all. Reviewed-by: Dr. David Alan Gilbert Reviewed-by: Juan Quintela Signed-off-by: Peter Xu Message-Id: <20180710091902.28780-4-peterx@redhat.com> Signed-off-by: Dr. David Alan Gilbert --- migration/ram.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/migration/ram.c b/migration/ram.c index 49068e8..52dd678 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -235,7 +235,7 @@ int64_t ramblock_recv_bitmap_send(QEMUFile *file, bitmap_to_le(le_bitmap, block->receivedmap, nbits); /* Size of the bitmap, in bytes */ - size = nbits / 8; + size = DIV_ROUND_UP(nbits, 8); /* * size is always aligned to 8 bytes for 64bit machines, but it @@ -3944,7 +3944,7 @@ int ram_dirty_bitmap_reload(MigrationState *s, RAMBlock *block) int ret = -EINVAL; QEMUFile *file = s->rp_state.from_dst_file; unsigned long *le_bitmap, nbits = block->used_length >> TARGET_PAGE_BITS; - uint64_t local_size = nbits / 8; + uint64_t local_size = DIV_ROUND_UP(nbits, 8); uint64_t size, end_mark; trace_ram_dirty_bitmap_reload_begin(block->idstr); -- cgit v1.1