On 03/15/2013 09:50 AM, Peter Lieven wrote: > during bulk stage of ram migration if a page is a > zero page do not send it at all. > the memory at the destination reads as zero anyway. > > even if there is an madvise with QEMU_MADV_DONTNEED > at the target upon receival of a zero page I have observed s/receival/receipt/ > that the target starts swapping if the memory is overcommitted. > it seems that the pages are dropped asynchronously. > > Signed-off-by: Peter Lieven > --- > arch_init.c | 8 +++++--- > 1 file changed, 5 insertions(+), 3 deletions(-) > +++ b/arch_init.c > @@ -432,9 +432,11 @@ static int ram_save_block(QEMUFile *f, bool last_stage) > bytes_sent = -1; > if (buffer_is_zero(p, TARGET_PAGE_SIZE)) { > acct_info.dup_pages++; > - bytes_sent = save_block_hdr(f, block, offset, cont, > - RAM_SAVE_FLAG_COMPRESS); > - qemu_put_byte(f, *p); > + if (!ram_bulk_stage) { > + bytes_sent = save_block_hdr(f, block, offset, cont, > + RAM_SAVE_FLAG_COMPRESS); > + qemu_put_byte(f, *p); Hmm, in patch 5/9, why not 'qemu_put_byte(f, 0)' instead of spending time dereferencing *p, since you already know the byte is 0? > + } > bytes_sent += 1; Your accounting is now off. This increments bytes_sent even when nothing was sent in the bulk phase. When touching this line, consider using ++ instead of += 1. > } else if (migrate_use_xbzrle()) { > current_addr = block->offset + offset; > -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org