aboutsummaryrefslogtreecommitdiff
path: root/arch_init.c
diff options
context:
space:
mode:
authorPeter Lieven <pl@kamp.de>2013-06-10 12:14:20 +0200
committerJuan Quintela <quintela@redhat.com>2013-06-27 02:36:32 +0200
commit211ea74022f51164a7729030b28eec90b6c99a08 (patch)
tree58f143a42096d24fe5f996fe971eb92c55546be4 /arch_init.c
parent9ef051e5536b6368a1076046ec6c4ec4ac12b5c6 (diff)
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>
Diffstat (limited to 'arch_init.c')
-rw-r--r--arch_init.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/arch_init.c b/arch_init.c
index 8bb933fddb..4dd17f4ff3 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -835,14 +835,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;