@ -425,18 +425,25 @@ uint64_t ram_bytes_remaining(void)
0 ;
}
/*
* NOTE : not all stats in ram_counters are used in reality . See comments
* for struct MigrationAtomicStats . The ultimate result of ram migration
* counters will be a merged version with both ram_counters and the atomic
* fields in ram_atomic_counters .
*/
MigrationStats ram_counters ;
MigrationAtomicStats ram_atomic_counters ;
void ram_transferred_add ( uint64_t bytes )
{
if ( runstate_is_running ( ) ) {
ram_counters . precopy_bytes + = bytes ;
} else if ( migration_in_postcopy ( ) ) {
ram_counters . postcopy_bytes + = bytes ;
stat64_add ( & ram_atomic_ counters . postcopy_bytes , bytes ) ;
} else {
ram_counters . downtime_bytes + = bytes ;
}
ram_counters . transferred + = bytes ;
stat64_add ( & ram_atomic_ counters . transferred , bytes ) ;
}
void dirty_sync_missed_zero_copy ( void )
@ -725,7 +732,7 @@ void mig_throttle_counter_reset(void)
rs - > time_last_bitmap_sync = qemu_clock_get_ms ( QEMU_CLOCK_REALTIME ) ;
rs - > num_dirty_pages_period = 0 ;
rs - > bytes_xfer_prev = ram_counters . transferred ;
rs - > bytes_xfer_prev = stat64_get ( & ram_atomic _counters . transferred ) ;
}
/**
@ -1085,8 +1092,9 @@ uint64_t ram_pagesize_summary(void)
uint64_t ram_get_total_transferred_pages ( void )
{
return ram_counters . normal + ram_counters . duplicate +
compression_counters . pages + xbzrle_counters . pages ;
return stat64_get ( & ram_atomic_counters . normal ) +
stat64_get ( & ram_atomic_counters . duplicate ) +
compression_counters . pages + xbzrle_counters . pages ;
}
static void migration_update_rates ( RAMState * rs , int64_t end_time )
@ -1145,8 +1153,8 @@ static void migration_trigger_throttle(RAMState *rs)
{
MigrationState * s = migrate_get_current ( ) ;
uint64_t threshold = s - > parameters . throttle_trigger_threshold ;
uint64_t bytes_xfer_period = ram _counters. transferred - rs - > bytes_xfer_prev ;
uint64_t bytes_xfer_period =
stat64_get ( & ram_atomic _counters . transferred ) - rs - > bytes_xfer_prev ;
uint64_t bytes_dirty_period = rs - > num_dirty_pages_period * TARGET_PAGE_SIZE ;
uint64_t bytes_dirty_threshold = bytes_xfer_period * threshold / 100 ;
@ -1209,7 +1217,7 @@ static void migration_bitmap_sync(RAMState *rs)
/* reset period counters */
rs - > time_last_bitmap_sync = end_time ;
rs - > num_dirty_pages_period = 0 ;
rs - > bytes_xfer_prev = ram_counters . transferred ;
rs - > bytes_xfer_prev = stat64_get ( & ram_atomic _counters . transferred ) ;
}
if ( migrate_use_events ( ) ) {
qapi_event_send_migration_pass ( ram_counters . dirty_sync_count ) ;
@ -1285,7 +1293,7 @@ static int save_zero_page(RAMState *rs, RAMBlock *block, ram_addr_t offset)
int len = save_zero_page_to_file ( rs , rs - > f , block , offset ) ;
if ( len ) {
ram_counters . duplicate + + ;
stat64_add ( & ram_atomic _counters . duplicate , 1 ) ;
ram_transferred_add ( len ) ;
return 1 ;
}
@ -1322,9 +1330,9 @@ static bool control_save_page(RAMState *rs, RAMBlock *block, ram_addr_t offset,
}
if ( bytes_xmit > 0 ) {
ram_counters . normal + + ;
stat64_add ( & ram_atomic _counters . normal , 1 ) ;
} else if ( bytes_xmit = = 0 ) {
ram_counters . duplicate + + ;
stat64_add ( & ram_atomic _counters . duplicate , 1 ) ;
}
return true ;
@ -1354,7 +1362,7 @@ static int save_normal_page(RAMState *rs, RAMBlock *block, ram_addr_t offset,
qemu_put_buffer ( rs - > f , buf , TARGET_PAGE_SIZE ) ;
}
ram_transferred_add ( TARGET_PAGE_SIZE ) ;
ram_counters . normal + + ;
stat64_add ( & ram_atomic _counters . normal , 1 ) ;
return 1 ;
}
@ -1410,7 +1418,7 @@ static int ram_save_multifd_page(RAMState *rs, RAMBlock *block,
if ( multifd_queue_page ( rs - > f , block , offset ) < 0 ) {
return - 1 ;
}
ram_counters . normal + + ;
stat64_add ( & ram_atomic _counters . normal , 1 ) ;
return 1 ;
}
@ -1448,7 +1456,7 @@ update_compress_thread_counts(const CompressParam *param, int bytes_xmit)
ram_transferred_add ( bytes_xmit ) ;
if ( param - > zero_page ) {
ram_counters . duplicate + + ;
stat64_add ( & ram_atomic _counters . duplicate , 1 ) ;
return ;
}
@ -2623,9 +2631,9 @@ void acct_update_position(QEMUFile *f, size_t size, bool zero)
uint64_t pages = size / TARGET_PAGE_SIZE ;
if ( zero ) {
ram_counters . duplicate + = pages ;
stat64_add ( & ram_atomic_ counters . duplicate , pages ) ;
} else {
ram_counters . normal + = pages ;
stat64_add ( & ram_atomic_ counters . normal , pages ) ;
ram_transferred_add ( size ) ;
qemu_file_credit_transfer ( f , size ) ;
}