Message ID | 1636533456-5374-1-git-send-email-lei.rao@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/2] Fixed a QEMU hang when guest poweroff in COLO mode | expand |
"Rao, Lei" <lei.rao@intel.com> wrote: > From: "Rao, Lei" <lei.rao@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.rao@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
OK, will be changed in V2. Thanks, Lei -----Original Message----- From: Juan Quintela <quintela@redhat.com> Sent: Wednesday, November 10, 2021 5:55 PM To: Rao, Lei <lei.rao@intel.com> Cc: Zhang, Chen <chen.zhang@intel.com>; zhang.zhanghailiang@huawei.com; dgilbert@redhat.com; qemu-devel@nongnu.org Subject: Re: [PATCH 1/2] Fixed a QEMU hang when guest poweroff in COLO mode "Rao, Lei" <lei.rao@intel.com> wrote: > From: "Rao, Lei" <lei.rao@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.rao@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
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); + } /* * Cancel the current migration - that will (eventually) * stop the migration using this structure