@ -702,6 +702,25 @@ bool migrate_cpu_throttle_tailslow(void)
return s - > parameters . cpu_throttle_tailslow ;
}
bool migrate_direct_io ( void )
{
MigrationState * s = migrate_get_current ( ) ;
/*
* O_DIRECT is only supported with mapped - ram and multifd .
*
* mapped - ram is needed because filesystems impose restrictions on
* O_DIRECT IO alignment ( see MAPPED_RAM_FILE_OFFSET_ALIGNMENT ) .
*
* multifd is needed to keep the unaligned portion of the stream
* isolated to the main migration thread while multifd channels
* process the aligned data with O_DIRECT enabled .
*/
return s - > parameters . direct_io & &
s - > capabilities [ MIGRATION_CAPABILITY_MAPPED_RAM ] & &
s - > capabilities [ MIGRATION_CAPABILITY_MULTIFD ] ;
}
uint64_t migrate_downtime_limit ( void )
{
MigrationState * s = migrate_get_current ( ) ;
@ -905,6 +924,8 @@ MigrationParameters *qmp_query_migrate_parameters(Error **errp)
params - > mode = s - > parameters . mode ;
params - > has_zero_page_detection = true ;
params - > zero_page_detection = s - > parameters . zero_page_detection ;
params - > has_direct_io = true ;
params - > direct_io = s - > parameters . direct_io ;
return params ;
}
@ -937,6 +958,7 @@ void migrate_params_init(MigrationParameters *params)
params - > has_vcpu_dirty_limit = true ;
params - > has_mode = true ;
params - > has_zero_page_detection = true ;
params - > has_direct_io = true ;
}
/*
@ -1110,6 +1132,11 @@ bool migrate_params_check(MigrationParameters *params, Error **errp)
return false ;
}
if ( params - > has_direct_io & & params - > direct_io & & ! qemu_has_direct_io ( ) ) {
error_setg ( errp , " No build-time support for direct-io " ) ;
return false ;
}
return true ;
}
@ -1216,6 +1243,10 @@ static void migrate_params_test_apply(MigrateSetParameters *params,
if ( params - > has_zero_page_detection ) {
dest - > zero_page_detection = params - > zero_page_detection ;
}
if ( params - > has_direct_io ) {
dest - > direct_io = params - > direct_io ;
}
}
static void migrate_params_apply ( MigrateSetParameters * params , Error * * errp )
@ -1341,6 +1372,10 @@ static void migrate_params_apply(MigrateSetParameters *params, Error **errp)
if ( params - > has_zero_page_detection ) {
s - > parameters . zero_page_detection = params - > zero_page_detection ;
}
if ( params - > has_direct_io ) {
s - > parameters . direct_io = params - > direct_io ;
}
}
void qmp_migrate_set_parameters ( MigrateSetParameters * params , Error * * errp )