Sorry for the late reply due to CNY. Auto-converge ensure that live migration can be completed smoothly when there are too many dirty pages. COLO may encounter the same situation when rebuild a new secondary VM. So, I think it is necessary to enable COLO and auto-converge at the same time.
Thanks, Lei. -----Original Message----- From: Lukas Straub <lukasstra...@web.de> Sent: Sunday, February 14, 2021 6:52 PM To: Rao, Lei <lei....@intel.com> Cc: Zhang, Chen <chen.zh...@intel.com>; lizhij...@cn.fujitsu.com; jasow...@redhat.com; zhang.zhanghaili...@huawei.com; quint...@redhat.com; dgilb...@redhat.com; qemu-devel@nongnu.org Subject: Re: [PATCH 07/10] Disable auto-coverge before entering COLO mode. On Wed, 13 Jan 2021 10:46:32 +0800 leirao <lei....@intel.com> wrote: > From: "Rao, Lei" <lei....@intel.com> > > If we don't disable the feature of auto-converge for live migration > before entering COLO mode, it will continue to run with COLO running, > and eventually the system will hang due to the CPU throttle reaching > DEFAULT_MIGRATE_MAX_CPU_THROTTLE. > > Signed-off-by: Lei Rao <lei....@intel.com> > --- > migration/migration.c | 16 +++++++++++++++- > 1 file changed, 15 insertions(+), 1 deletion(-) > > diff --git a/migration/migration.c b/migration/migration.c index > 31417ce..6ab37e5 100644 > --- a/migration/migration.c > +++ b/migration/migration.c > @@ -1673,6 +1673,20 @@ void migrate_set_block_enabled(bool value, Error > **errp) > qapi_free_MigrationCapabilityStatusList(cap); > } > > +static void colo_auto_converge_enabled(bool value, Error **errp) { > + MigrationCapabilityStatusList *cap = NULL; > + > + if (migrate_colo_enabled() && migrate_auto_converge()) { > + QAPI_LIST_PREPEND(cap, > + migrate_cap_add(MIGRATION_CAPABILITY_AUTO_CONVERGE, > + value)); > + qmp_migrate_set_capabilities(cap, errp); > + qapi_free_MigrationCapabilityStatusList(cap); > + } > + cpu_throttle_stop(); > +} > + I think it's better to error out in migration_prepare or migrate_caps_check if both colo and auto-converge is enabled. > static void migrate_set_block_incremental(MigrationState *s, bool > value) { > s->parameters.block_incremental = value; @@ -3401,7 +3415,7 @@ > static MigIterateState migration_iteration_run(MigrationState *s) > static void migration_iteration_finish(MigrationState *s) { > /* If we enabled cpu throttling for auto-converge, turn it off. */ > - cpu_throttle_stop(); > + colo_auto_converge_enabled(false, &error_abort); > > qemu_mutex_lock_iothread(); > switch (s->state) { --