On Wed, Feb 21, 2024 at 5:58 AM Elena Ufimtseva <ufimts...@gmail.com> wrote: > > > > On Fri, Feb 16, 2024 at 2:41 PM Hao Xiang <hao.xi...@bytedance.com> wrote: >> >> This new parameter controls where the zero page checking is running. >> 1. If this parameter is set to 'legacy', zero page checking is >> done in the migration main thread. >> 2. If this parameter is set to 'none', zero page checking is disabled. >> > > Hello Hao > > Few questions and comments. > > First the commit message states that the parameter control where the checking > is done, but it also controls > if sending of zero pages is done by multifd threads or not. > > >> >> Signed-off-by: Hao Xiang <hao.xi...@bytedance.com> >> --- >> hw/core/qdev-properties-system.c | 10 ++++++++++ >> include/hw/qdev-properties-system.h | 4 ++++ >> migration/migration-hmp-cmds.c | 9 +++++++++ >> migration/options.c | 21 ++++++++++++++++++++ >> migration/options.h | 1 + >> migration/ram.c | 4 ++++ >> qapi/migration.json | 30 ++++++++++++++++++++++++++--- >> 7 files changed, 76 insertions(+), 3 deletions(-) >> >> diff --git a/hw/core/qdev-properties-system.c >> b/hw/core/qdev-properties-system.c >> index 1a396521d5..63843f18b5 100644 >> --- a/hw/core/qdev-properties-system.c >> +++ b/hw/core/qdev-properties-system.c >> @@ -679,6 +679,16 @@ const PropertyInfo qdev_prop_mig_mode = { >> .set_default_value = qdev_propinfo_set_default_value_enum, >> }; >> >> +const PropertyInfo qdev_prop_zero_page_detection = { >> + .name = "ZeroPageDetection", >> + .description = "zero_page_detection values, " >> + "multifd,legacy,none", >> + .enum_table = &ZeroPageDetection_lookup, >> + .get = qdev_propinfo_get_enum, >> + .set = qdev_propinfo_set_enum, >> + .set_default_value = qdev_propinfo_set_default_value_enum, >> +}; >> + >> /* --- Reserved Region --- */ >> >> /* >> diff --git a/include/hw/qdev-properties-system.h >> b/include/hw/qdev-properties-system.h >> index 06c359c190..839b170235 100644 >> --- a/include/hw/qdev-properties-system.h >> +++ b/include/hw/qdev-properties-system.h >> @@ -8,6 +8,7 @@ extern const PropertyInfo qdev_prop_macaddr; >> extern const PropertyInfo qdev_prop_reserved_region; >> extern const PropertyInfo qdev_prop_multifd_compression; >> extern const PropertyInfo qdev_prop_mig_mode; >> +extern const PropertyInfo qdev_prop_zero_page_detection; >> extern const PropertyInfo qdev_prop_losttickpolicy; >> extern const PropertyInfo qdev_prop_blockdev_on_error; >> extern const PropertyInfo qdev_prop_bios_chs_trans; >> @@ -47,6 +48,9 @@ extern const PropertyInfo >> qdev_prop_iothread_vq_mapping_list; >> #define DEFINE_PROP_MIG_MODE(_n, _s, _f, _d) \ >> DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_mig_mode, \ >> MigMode) >> +#define DEFINE_PROP_ZERO_PAGE_DETECTION(_n, _s, _f, _d) \ >> + DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_zero_page_detection, \ >> + ZeroPageDetection) >> #define DEFINE_PROP_LOSTTICKPOLICY(_n, _s, _f, _d) \ >> DEFINE_PROP_SIGNED(_n, _s, _f, _d, qdev_prop_losttickpolicy, \ >> LostTickPolicy) >> diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-cmds.c >> index 99b49df5dd..7e96ae6ffd 100644 >> --- a/migration/migration-hmp-cmds.c >> +++ b/migration/migration-hmp-cmds.c >> @@ -344,6 +344,11 @@ void hmp_info_migrate_parameters(Monitor *mon, const >> QDict *qdict) >> monitor_printf(mon, "%s: %s\n", >> MigrationParameter_str(MIGRATION_PARAMETER_MULTIFD_COMPRESSION), >> MultiFDCompression_str(params->multifd_compression)); >> + assert(params->has_zero_page_detection); > > > What is the reason to have assert here?
It's just to verify that the option is initialized properly before we reach here. Same things are done for other options. > >> >> + monitor_printf(mon, "%s: %s\n", >> + MigrationParameter_str(MIGRATION_PARAMETER_ZERO_PAGE_DETECTION), >> + qapi_enum_lookup(&ZeroPageDetection_lookup, >> + params->zero_page_detection)); >> monitor_printf(mon, "%s: %" PRIu64 " bytes\n", >> MigrationParameter_str(MIGRATION_PARAMETER_XBZRLE_CACHE_SIZE), >> params->xbzrle_cache_size); >> @@ -634,6 +639,10 @@ void hmp_migrate_set_parameter(Monitor *mon, const >> QDict *qdict) >> p->has_multifd_zstd_level = true; >> visit_type_uint8(v, param, &p->multifd_zstd_level, &err); >> break; >> + case MIGRATION_PARAMETER_ZERO_PAGE_DETECTION: >> + p->has_zero_page_detection = true; >> + visit_type_ZeroPageDetection(v, param, &p->zero_page_detection, >> &err); >> + break; >> case MIGRATION_PARAMETER_XBZRLE_CACHE_SIZE: >> p->has_xbzrle_cache_size = true; >> if (!visit_type_size(v, param, &cache_size, &err)) { >> diff --git a/migration/options.c b/migration/options.c >> index 3e3e0b93b4..3c603391b0 100644 >> --- a/migration/options.c >> +++ b/migration/options.c >> @@ -179,6 +179,9 @@ Property migration_properties[] = { >> DEFINE_PROP_MIG_MODE("mode", MigrationState, >> parameters.mode, >> MIG_MODE_NORMAL), >> + DEFINE_PROP_ZERO_PAGE_DETECTION("zero-page-detection", MigrationState, >> + parameters.zero_page_detection, >> + ZERO_PAGE_DETECTION_LEGACY), >> >> /* Migration capabilities */ >> DEFINE_PROP_MIG_CAP("x-xbzrle", MIGRATION_CAPABILITY_XBZRLE), >> @@ -903,6 +906,13 @@ uint64_t migrate_xbzrle_cache_size(void) >> return s->parameters.xbzrle_cache_size; >> } >> >> +ZeroPageDetection migrate_zero_page_detection(void) >> +{ >> + MigrationState *s = migrate_get_current(); >> + >> + return s->parameters.zero_page_detection; >> +} >> + >> /* parameter setters */ >> >> void migrate_set_block_incremental(bool value) >> @@ -1013,6 +1023,8 @@ MigrationParameters >> *qmp_query_migrate_parameters(Error **errp) >> params->vcpu_dirty_limit = s->parameters.vcpu_dirty_limit; >> params->has_mode = true; >> params->mode = s->parameters.mode; >> + params->has_zero_page_detection = true; >> + params->zero_page_detection = s->parameters.zero_page_detection; >> >> return params; >> } >> @@ -1049,6 +1061,7 @@ void migrate_params_init(MigrationParameters *params) >> params->has_x_vcpu_dirty_limit_period = true; >> params->has_vcpu_dirty_limit = true; >> params->has_mode = true; >> + params->has_zero_page_detection = true; >> } >> >> /* >> @@ -1350,6 +1363,10 @@ static void >> migrate_params_test_apply(MigrateSetParameters *params, >> if (params->has_mode) { >> dest->mode = params->mode; >> } >> + >> + if (params->has_zero_page_detection) { >> + dest->zero_page_detection = params->zero_page_detection; >> + } >> } >> >> static void migrate_params_apply(MigrateSetParameters *params, Error **errp) >> @@ -1494,6 +1511,10 @@ static void migrate_params_apply(MigrateSetParameters >> *params, Error **errp) >> if (params->has_mode) { >> s->parameters.mode = params->mode; >> } >> + >> + if (params->has_zero_page_detection) { >> + s->parameters.zero_page_detection = params->zero_page_detection; >> + } >> } >> >> void qmp_migrate_set_parameters(MigrateSetParameters *params, Error **errp) >> diff --git a/migration/options.h b/migration/options.h >> index 246c160aee..b7c4fb3861 100644 >> --- a/migration/options.h >> +++ b/migration/options.h >> @@ -93,6 +93,7 @@ const char *migrate_tls_authz(void); >> const char *migrate_tls_creds(void); >> const char *migrate_tls_hostname(void); >> uint64_t migrate_xbzrle_cache_size(void); >> +ZeroPageDetection migrate_zero_page_detection(void); >> >> /* parameters setters */ >> >> diff --git a/migration/ram.c b/migration/ram.c >> index 4649a81204..556725c30f 100644 >> --- a/migration/ram.c >> +++ b/migration/ram.c >> @@ -1123,6 +1123,10 @@ static int save_zero_page(RAMState *rs, >> PageSearchStatus *pss, >> QEMUFile *file = pss->pss_channel; >> int len = 0; >> >> + if (migrate_zero_page_detection() != ZERO_PAGE_DETECTION_LEGACY) { >> + return 0; >> + } >> + >> if (!buffer_is_zero(p, TARGET_PAGE_SIZE)) { >> return 0; >> } >> diff --git a/qapi/migration.json b/qapi/migration.json >> index 5a565d9b8d..99843a8e95 100644 >> --- a/qapi/migration.json >> +++ b/qapi/migration.json >> @@ -653,6 +653,17 @@ >> { 'enum': 'MigMode', >> 'data': [ 'normal', 'cpr-reboot' ] } >> >> +## >> +# @ZeroPageDetection: >> +# >> +# @legacy: Perform zero page checking from main migration thread. (since >> 9.0) >> +# >> +# @none: Do not perform zero page checking. >> +# >> +## >> +{ 'enum': 'ZeroPageDetection', >> + 'data': [ 'legacy', 'none' ] } >> + > > > Above you have introduced the qdev property qdev_prop_zero_page_detection > with multifd, but it is not present in the scheme. > Perhaps 'mulitfd' in qdev_prop_zero_page_detection belongs to another patch? You are right. I will fix that. > > >> >> ## >> # @BitmapMigrationBitmapAliasTransform: >> # >> @@ -874,6 +885,9 @@ >> # @mode: Migration mode. See description in @MigMode. Default is 'normal'. >> # (Since 8.2) >> # >> +# @zero-page-detection: See description in @ZeroPageDetection. >> +# Default is 'legacy'. (Since 9.0) >> +# >> # Features: >> # >> # @deprecated: Member @block-incremental is deprecated. Use >> @@ -907,7 +921,8 @@ >> 'block-bitmap-mapping', >> { 'name': 'x-vcpu-dirty-limit-period', 'features': ['unstable'] >> }, >> 'vcpu-dirty-limit', >> - 'mode'] } >> + 'mode', >> + 'zero-page-detection'] } >> >> ## >> # @MigrateSetParameters: >> @@ -1066,6 +1081,10 @@ >> # @mode: Migration mode. See description in @MigMode. Default is 'normal'. >> # (Since 8.2) >> # >> +# @zero-page-detection: See description in @ZeroPageDetection. >> +# Default is 'legacy'. (Since 9.0) >> +# >> +# >> # Features: >> # >> # @deprecated: Member @block-incremental is deprecated. Use >> @@ -1119,7 +1138,8 @@ >> '*x-vcpu-dirty-limit-period': { 'type': 'uint64', >> 'features': [ 'unstable' ] }, >> '*vcpu-dirty-limit': 'uint64', >> - '*mode': 'MigMode'} } >> + '*mode': 'MigMode', >> + '*zero-page-detection': 'ZeroPageDetection'} } >> >> ## >> # @migrate-set-parameters: >> @@ -1294,6 +1314,9 @@ >> # @mode: Migration mode. See description in @MigMode. Default is 'normal'. >> # (Since 8.2) >> # >> +# @zero-page-detection: See description in @ZeroPageDetection. >> +# Default is 'legacy'. (Since 9.0) >> +# >> # Features: >> # >> # @deprecated: Member @block-incremental is deprecated. Use >> @@ -1344,7 +1367,8 @@ >> '*x-vcpu-dirty-limit-period': { 'type': 'uint64', >> 'features': [ 'unstable' ] }, >> '*vcpu-dirty-limit': 'uint64', >> - '*mode': 'MigMode'} } >> + '*mode': 'MigMode', >> + '*zero-page-detection': 'ZeroPageDetection'} } >> >> ## >> # @query-migrate-parameters: >> -- >> 2.30.2 >> >> > > > -- > Elena