diff options
author | Anthony Liguori <anthony@codemonkey.ws> | 2013-09-30 17:13:43 -0500 |
---|---|---|
committer | Anthony Liguori <anthony@codemonkey.ws> | 2013-09-30 17:13:43 -0500 |
commit | 8429d63b0e5671f112cb4cbf8ab6d697a676ccc4 (patch) | |
tree | 6ecce9cd3ad93dcaa54465ea275ed43fb20e43de /arch_init.c | |
parent | d7f0efcb229bc1c3e458c6968efe4a6644f24740 (diff) | |
parent | d613a56f845788412a442c6b5aff88b38244f99a (diff) | |
download | qemu-8429d63b0e5671f112cb4cbf8ab6d697a676ccc4.zip qemu-8429d63b0e5671f112cb4cbf8ab6d697a676ccc4.tar.gz qemu-8429d63b0e5671f112cb4cbf8ab6d697a676ccc4.tar.bz2 |
Merge remote-tracking branch 'quintela/migration.next' into staging
# By Isaku Yamahata (4) and others
# Via Juan Quintela
* quintela/migration.next:
migration: ram_handle_compressed
arch_init: make is_zero_page accept size
migration: Fix debug print type
migration: add version supporting macros for struct pointer
rdma: constify ram_chunk_{index, start, end}
rdma: clean up of qemu_rdma_cleanup()
arch_init: right return for ram_save_iterate
savevm: fix wrong initialization by ram_control_load_hook
savevm: add comments for qemu_file_get_error()
Message-id: 1380024203-25897-1-git-send-email-quintela@redhat.com
Diffstat (limited to 'arch_init.c')
-rw-r--r-- | arch_init.c | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/arch_init.c b/arch_init.c index e47e139..d14457d 100644 --- a/arch_init.c +++ b/arch_init.c @@ -150,10 +150,9 @@ int qemu_read_default_config_files(bool userconfig) return 0; } -static inline bool is_zero_page(uint8_t *p) +static inline bool is_zero_range(uint8_t *p, uint64_t size) { - return buffer_find_nonzero_offset(p, TARGET_PAGE_SIZE) == - TARGET_PAGE_SIZE; + return buffer_find_nonzero_offset(p, size) == size; } /* struct contains XBZRLE cache and a static page @@ -497,7 +496,7 @@ static int ram_save_block(QEMUFile *f, bool last_stage) acct_info.dup_pages++; } } - } else if (is_zero_page(p)) { + } else if (is_zero_range(p, TARGET_PAGE_SIZE)) { acct_info.dup_pages++; bytes_sent = save_block_hdr(f, block, offset, cont, RAM_SAVE_FLAG_COMPRESS); @@ -710,15 +709,20 @@ static int ram_save_iterate(QEMUFile *f, void *opaque) */ ram_control_after_iterate(f, RAM_CONTROL_ROUND); + bytes_transferred += total_sent; + + /* + * Do not count these 8 bytes into total_sent, so that we can + * return 0 if no page had been dirtied. + */ + qemu_put_be64(f, RAM_SAVE_FLAG_EOS); + bytes_transferred += 8; + + ret = qemu_file_get_error(f); if (ret < 0) { - bytes_transferred += total_sent; return ret; } - qemu_put_be64(f, RAM_SAVE_FLAG_EOS); - total_sent += 8; - bytes_transferred += total_sent; - return total_sent; } @@ -844,13 +848,14 @@ static inline void *host_from_stream_offset(QEMUFile *f, */ void ram_handle_compressed(void *host, uint8_t ch, uint64_t size) { - if (ch != 0 || !is_zero_page(host)) { + if (ch != 0 || !is_zero_range(host, size)) { memset(host, ch, size); #ifndef _WIN32 - if (ch == 0 && - (!kvm_enabled() || kvm_has_sync_mmu()) && - getpagesize() <= TARGET_PAGE_SIZE) { - qemu_madvise(host, TARGET_PAGE_SIZE, QEMU_MADV_DONTNEED); + if (ch == 0 && (!kvm_enabled() || kvm_has_sync_mmu())) { + size = size & ~(getpagesize() - 1); + if (size > 0) { + qemu_madvise(host, size, QEMU_MADV_DONTNEED); + } } #endif } |