@ -89,7 +89,7 @@ static struct mig_cmd_args {
[ MIG_CMD_INVALID ] = { . len = - 1 , . name = " INVALID " } ,
[ MIG_CMD_OPEN_RETURN_PATH ] = { . len = 0 , . name = " OPEN_RETURN_PATH " } ,
[ MIG_CMD_PING ] = { . len = sizeof ( uint32_t ) , . name = " PING " } ,
[ MIG_CMD_POSTCOPY_ADVISE ] = { . len = 16 , . name = " POSTCOPY_ADVISE " } ,
[ MIG_CMD_POSTCOPY_ADVISE ] = { . len = - 1 , . name = " POSTCOPY_ADVISE " } ,
[ MIG_CMD_POSTCOPY_LISTEN ] = { . len = 0 , . name = " POSTCOPY_LISTEN " } ,
[ MIG_CMD_POSTCOPY_RUN ] = { . len = 0 , . name = " POSTCOPY_RUN " } ,
[ MIG_CMD_POSTCOPY_RAM_DISCARD ] = {
@ -98,6 +98,23 @@ static struct mig_cmd_args {
[ MIG_CMD_MAX ] = { . len = - 1 , . name = " MAX " } ,
} ;
/* Note for MIG_CMD_POSTCOPY_ADVISE:
* The format of arguments is depending on postcopy mode :
* - postcopy RAM only
* uint64_t host page size
* uint64_t taget page size
*
* - postcopy RAM and postcopy dirty bitmaps
* format is the same as for postcopy RAM only
*
* - postcopy dirty bitmaps only
* Nothing . Command length field is 0.
*
* Be careful : adding a new postcopy entity with some other parameters should
* not break format self - description ability . Good way is to introduce some
* generic extendable format with an exception for two old entities .
*/
static int announce_self_create ( uint8_t * buf ,
uint8_t * mac_addr )
{
@ -861,12 +878,17 @@ int qemu_savevm_send_packaged(QEMUFile *f, const uint8_t *buf, size_t len)
/* Send prior to any postcopy transfer */
void qemu_savevm_send_postcopy_advise ( QEMUFile * f )
{
uint64_t tmp [ 2 ] ;
tmp [ 0 ] = cpu_to_be64 ( ram_pagesize_summary ( ) ) ;
tmp [ 1 ] = cpu_to_be64 ( qemu_target_page_size ( ) ) ;
if ( migrate_postcopy_ram ( ) ) {
uint64_t tmp [ 2 ] ;
tmp [ 0 ] = cpu_to_be64 ( ram_pagesize_summary ( ) ) ;
tmp [ 1 ] = cpu_to_be64 ( qemu_target_page_size ( ) ) ;
trace_qemu_savevm_send_postcopy_advise ( ) ;
qemu_savevm_command_send ( f , MIG_CMD_POSTCOPY_ADVISE , 16 , ( uint8_t * ) tmp ) ;
trace_qemu_savevm_send_postcopy_advise ( ) ;
qemu_savevm_command_send ( f , MIG_CMD_POSTCOPY_ADVISE ,
16 , ( uint8_t * ) tmp ) ;
} else {
qemu_savevm_command_send ( f , MIG_CMD_POSTCOPY_ADVISE , 0 , NULL ) ;
}
}
/* Sent prior to starting the destination running in postcopy, discard pages
@ -1354,6 +1376,10 @@ static int loadvm_postcopy_handle_advise(MigrationIncomingState *mis)
return - 1 ;
}
if ( ! migrate_postcopy_ram ( ) ) {
return 0 ;
}
if ( ! postcopy_ram_supported_by_host ( ) ) {
postcopy_state_set ( POSTCOPY_INCOMING_NONE ) ;
return - 1 ;
@ -1564,7 +1590,9 @@ static int loadvm_postcopy_handle_listen(MigrationIncomingState *mis)
* A rare case , we entered listen without having to do any discards ,
* so do the setup that ' s normally done at the time of the 1 st discard .
*/
postcopy_ram_prepare_discard ( mis ) ;
if ( migrate_postcopy_ram ( ) ) {
postcopy_ram_prepare_discard ( mis ) ;
}
}
/*
@ -1572,8 +1600,10 @@ static int loadvm_postcopy_handle_listen(MigrationIncomingState *mis)
* However , at this point the CPU shouldn ' t be running , and the IO
* shouldn ' t be doing anything yet so don ' t actually expect requests
*/
if ( postcopy_ram_enable_notify ( mis ) ) {
return - 1 ;
if ( migrate_postcopy_ram ( ) ) {
if ( postcopy_ram_enable_notify ( mis ) ) {
return - 1 ;
}
}
if ( mis - > have_listen_thread ) {