mirror of https://github.com/proxmox/mirror_qemu
migration/postcopy: map large zero page in postcopy_ram_incoming_setup()
postcopy_ram_incoming_setup() and postcopy_ram_incoming_cleanup() are counterpart. It is reasonable to map/unmap large zero page in these two functions respectively. Signed-off-by: Wei Yang <richardw.yang@linux.intel.com> Message-Id: <20191005135021.21721-3-richardw.yang@linux.intel.com> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>master
parent
3414322a83
commit
6629890d55
|
@ -1144,6 +1144,22 @@ int postcopy_ram_enable_notify(MigrationIncomingState *mis)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Map large zero page when kernel can't use UFFDIO_ZEROPAGE for hugepages
|
||||||
|
*/
|
||||||
|
mis->postcopy_tmp_zero_page = mmap(NULL, mis->largest_page_size,
|
||||||
|
PROT_READ | PROT_WRITE,
|
||||||
|
MAP_PRIVATE | MAP_ANONYMOUS,
|
||||||
|
-1, 0);
|
||||||
|
if (mis->postcopy_tmp_zero_page == MAP_FAILED) {
|
||||||
|
int e = errno;
|
||||||
|
mis->postcopy_tmp_zero_page = NULL;
|
||||||
|
error_report("%s: Failed to map large zero page %s",
|
||||||
|
__func__, strerror(e));
|
||||||
|
return -e;
|
||||||
|
}
|
||||||
|
memset(mis->postcopy_tmp_zero_page, '\0', mis->largest_page_size);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Ballooning can mark pages as absent while we're postcopying
|
* Ballooning can mark pages as absent while we're postcopying
|
||||||
* that would cause false userfaults.
|
* that would cause false userfaults.
|
||||||
|
@ -1250,23 +1266,7 @@ int postcopy_place_page_zero(MigrationIncomingState *mis, void *host,
|
||||||
qemu_ram_block_host_offset(rb,
|
qemu_ram_block_host_offset(rb,
|
||||||
host));
|
host));
|
||||||
} else {
|
} else {
|
||||||
/* The kernel can't use UFFDIO_ZEROPAGE for hugepages */
|
return postcopy_place_page(mis, host, mis->postcopy_tmp_zero_page, rb);
|
||||||
if (!mis->postcopy_tmp_zero_page) {
|
|
||||||
mis->postcopy_tmp_zero_page = mmap(NULL, mis->largest_page_size,
|
|
||||||
PROT_READ | PROT_WRITE,
|
|
||||||
MAP_PRIVATE | MAP_ANONYMOUS,
|
|
||||||
-1, 0);
|
|
||||||
if (mis->postcopy_tmp_zero_page == MAP_FAILED) {
|
|
||||||
int e = errno;
|
|
||||||
mis->postcopy_tmp_zero_page = NULL;
|
|
||||||
error_report("%s: %s mapping large zero page",
|
|
||||||
__func__, strerror(e));
|
|
||||||
return -e;
|
|
||||||
}
|
|
||||||
memset(mis->postcopy_tmp_zero_page, '\0', mis->largest_page_size);
|
|
||||||
}
|
|
||||||
return postcopy_place_page(mis, host, mis->postcopy_tmp_zero_page,
|
|
||||||
rb);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue