OK, will be changed in V2. Thanks, Lei
-----Original Message----- From: Juan Quintela <quint...@redhat.com> Sent: Wednesday, November 10, 2021 5:55 PM To: Rao, Lei <lei....@intel.com> Cc: Zhang, Chen <chen.zh...@intel.com>; zhang.zhanghaili...@huawei.com; dgilb...@redhat.com; qemu-devel@nongnu.org Subject: Re: [PATCH 1/2] Fixed a QEMU hang when guest poweroff in COLO mode "Rao, Lei" <lei....@intel.com> wrote: > From: "Rao, Lei" <lei....@intel.com> > > When the PVM guest poweroff, the COLO thread may wait a semaphore in > colo_process_checkpoint().So, we should wake up the COLO thread before > migration shutdown. > > Signed-off-by: Lei Rao <lei....@intel.com> A couple of notes. > --- > include/migration/colo.h | 1 + > migration/colo.c | 14 ++++++++++++++ > migration/migration.c | 10 ++++++++++ > 3 files changed, 25 insertions(+) > > diff --git a/include/migration/colo.h b/include/migration/colo.h index > 768e1f0..525b45a 100644 > --- a/include/migration/colo.h > +++ b/include/migration/colo.h > @@ -37,4 +37,5 @@ COLOMode get_colo_mode(void); void > colo_do_failover(void); > > void colo_checkpoint_notify(void *opaque); > +void colo_shutdown(COLOMode mode); > #endif > diff --git a/migration/colo.c b/migration/colo.c index > 2415325..385c1d7 100644 > --- a/migration/colo.c > +++ b/migration/colo.c > @@ -820,6 +820,20 @@ static void > colo_wait_handle_message(MigrationIncomingState *mis, > } > } > > +void colo_shutdown(COLOMode mode) > +{ > + if (mode == COLO_MODE_PRIMARY) { > + MigrationState *s = migrate_get_current(); > + > + qemu_event_set(&s->colo_checkpoint_event); > + qemu_sem_post(&s->colo_exit_sem); > + } else { > + MigrationIncomingState *mis = > + migration_incoming_get_current(); > + > + qemu_sem_post(&mis->colo_incoming_sem); > + } > +} > + > void *colo_process_incoming_thread(void *opaque) { > MigrationIncomingState *mis = opaque; diff --git > a/migration/migration.c b/migration/migration.c index abaf6f9..9df6328 > 100644 > --- a/migration/migration.c > +++ b/migration/migration.c > @@ -225,6 +225,16 @@ void migration_cancel(const Error *error) > > void migration_shutdown(void) > { > + COLOMode mode = get_colo_mode(); > + > + /* > + * When the QEMU main thread exit, the COLO thread > + * may wait a semaphore. So, we should wakeup the > + * COLO thread before migration shutdown. > + */ > + if (mode != COLO_MODE_NONE) { > + colo_shutdown(mode); > + } don't put the code on the main path. Could you just put all of this inside a colo_shutdown() call? Thanks, Juan. > /* > * Cancel the current migration - that will (eventually) > * stop the migration using this structure