summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Lieven <pl@kamp.de>2013-06-10 12:14:20 +0200
committerMichael Roth <mdroth@linux.vnet.ibm.com>2013-08-12 17:16:09 -0500
commit9f60383b4173c34772251446b0ab83b5c7152f16 (patch)
tree9be95b41ef1d514bdd9b9a8f9b4895d95baca872
parent64a72fa71fd2b9720c8b70726521c39bdd2c0ea9 (diff)
downloadqemu-9f60383b4173c34772251446b0ab83b5c7152f16.tar.gz
migration: do not overwrite zero pages
on incoming migration do not memset pages to zero if they already read as zero. this will allocate a new zero page and consume memory unnecessarily. even if we madvise a MADV_DONTNEED later this will only deallocate the memory asynchronously. Signed-off-by: Peter Lieven <pl@kamp.de> Signed-off-by: Juan Quintela <quintela@redhat.com> (cherry picked from commit 211ea74022f51164a7729030b28eec90b6c99a08) Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
-rw-r--r--arch_init.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/arch_init.c b/arch_init.c
index 6afc57e04c..b526dd0cb8 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -832,14 +832,16 @@ static int ram_load(QEMUFile *f, void *opaque, int version_id)
}
ch = qemu_get_byte(f);
- memset(host, ch, TARGET_PAGE_SIZE);
+ if (ch != 0 || !is_zero_page(host)) {
+ memset(host, ch, TARGET_PAGE_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()) &&
+ getpagesize() <= TARGET_PAGE_SIZE) {
+ qemu_madvise(host, TARGET_PAGE_SIZE, QEMU_MADV_DONTNEED);
+ }
#endif
+ }
} else if (flags & RAM_SAVE_FLAG_PAGE) {
void *host;