@ -321,7 +321,7 @@ int postcopy_ram_incoming_cleanup(MigrationIncomingState *mis)
migrate_send_rp_shut ( mis , qemu_file_get_error ( mis - > from_src_file ) ! = 0 ) ;
if ( mis - > postcopy_tmp_page ) {
munmap ( mis - > postcopy_tmp_page , getpagesize ( ) ) ;
munmap ( mis - > postcopy_tmp_page , mis - > largest_page_size ) ;
mis - > postcopy_tmp_page = NULL ;
}
trace_postcopy_ram_incoming_cleanup_exit ( ) ;
@ -543,13 +543,14 @@ int postcopy_ram_enable_notify(MigrationIncomingState *mis)
* Place a host page ( from ) at ( host ) atomically
* returns 0 on success
*/
int postcopy_place_page ( MigrationIncomingState * mis , void * host , void * from )
int postcopy_place_page ( MigrationIncomingState * mis , void * host , void * from ,
size_t pagesize )
{
struct uffdio_copy copy_struct ;
copy_struct . dst = ( uint64_t ) ( uintptr_t ) host ;
copy_struct . src = ( uint64_t ) ( uintptr_t ) from ;
copy_struct . len = get pagesize( ) ;
copy_struct . len = pagesize ;
copy_struct . mode = 0 ;
/* copy also acks to the kernel waking the stalled thread up
@ -559,8 +560,8 @@ int postcopy_place_page(MigrationIncomingState *mis, void *host, void *from)
*/
if ( ioctl ( mis - > userfault_fd , UFFDIO_COPY , & copy_struct ) ) {
int e = errno ;
error_report ( " %s: %s copy host: %p from: %p " ,
__func__ , strerror ( e ) , host , from ) ;
error_report ( " %s: %s copy host: %p from: %p (size: %zd) " ,
__func__ , strerror ( e ) , host , from , pagesize ) ;
return - e ;
}
@ -573,23 +574,29 @@ int postcopy_place_page(MigrationIncomingState *mis, void *host, void *from)
* Place a zero page at ( host ) atomically
* returns 0 on success
*/
int postcopy_place_page_zero ( MigrationIncomingState * mis , void * host )
int postcopy_place_page_zero ( MigrationIncomingState * mis , void * host ,
size_t pagesize )
{
struct uffdio_zeropage zero_struct ;
trace_postcopy_place_page_zero ( host ) ;
zero_struct . range . start = ( uint64_t ) ( uintptr_t ) host ;
zero_struct . range . len = getpagesize ( ) ;
zero_struct . mode = 0 ;
if ( pagesize = = getpagesize ( ) ) {
struct uffdio_zeropage zero_struct ;
zero_struct . range . start = ( uint64_t ) ( uintptr_t ) host ;
zero_struct . range . len = getpagesize ( ) ;
zero_struct . mode = 0 ;
if ( ioctl ( mis - > userfault_fd , UFFDIO_ZEROPAGE , & zero_struct ) ) {
int e = errno ;
error_report ( " %s: %s zero host: %p " ,
__func__ , strerror ( e ) , host ) ;
if ( ioctl ( mis - > userfault_fd , UFFDIO_ZEROPAGE , & zero_struct ) ) {
int e = errno ;
error_report ( " %s: %s zero host: %p " ,
__func__ , strerror ( e ) , host ) ;
return - e ;
return - e ;
}
} else {
/* TODO: The kernel can't use UFFDIO_ZEROPAGE for hugepages */
assert ( 0 ) ;
}
trace_postcopy_place_page_zero ( host ) ;
return 0 ;
}
@ -604,7 +611,7 @@ int postcopy_place_page_zero(MigrationIncomingState *mis, void *host)
void * postcopy_get_tmp_page ( MigrationIncomingState * mis )
{
if ( ! mis - > postcopy_tmp_page ) {
mis - > postcopy_tmp_page = mmap ( NULL , getpagesize ( ) ,
mis - > postcopy_tmp_page = mmap ( NULL , mis - > largest_page_size ,
PROT_READ | PROT_WRITE , MAP_PRIVATE |
MAP_ANONYMOUS , - 1 , 0 ) ;
if ( mis - > postcopy_tmp_page = = MAP_FAILED ) {
@ -649,13 +656,15 @@ int postcopy_ram_enable_notify(MigrationIncomingState *mis)
return - 1 ;
}
int postcopy_place_page ( MigrationIncomingState * mis , void * host , void * from )
int postcopy_place_page ( MigrationIncomingState * mis , void * host , void * from ,
size_t pagesize )
{
assert ( 0 ) ;
return - 1 ;
}
int postcopy_place_page_zero ( MigrationIncomingState * mis , void * host )
int postcopy_place_page_zero ( MigrationIncomingState * mis , void * host ,
size_t pagesize )
{
assert ( 0 ) ;
return - 1 ;