Message ID | 1636596693-8477-1-git-send-email-lei.rao@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] Fixed a QEMU hang when guest poweroff in COLO mode | expand |
> -----Original Message----- > From: Rao, Lei <lei.rao@intel.com> > Sent: Thursday, November 11, 2021 10:12 AM > To: Zhang, Chen <chen.zhang@intel.com>; > zhang.zhanghailiang@huawei.com; quintela@redhat.com; > dgilbert@redhat.com > Cc: qemu-devel@nongnu.org; Rao, Lei <lei.rao@intel.com> > Subject: [PATCH v2] Fixed a QEMU hang when guest poweroff in COLO mode > > 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> Looks good for me. Reviewed-by: Zhang Chen <chen.zhang@intel.com> Thanks Chen > --- > include/migration/colo.h | 1 + > migration/colo.c | 20 ++++++++++++++++++++ > migration/migration.c | 6 ++++++ > 3 files changed, 27 insertions(+) > > diff --git a/include/migration/colo.h b/include/migration/colo.h index > 768e1f0..5fbe1a6 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(void); > #endif > diff --git a/migration/colo.c b/migration/colo.c index 2415325..0d3d98f > 100644 > --- a/migration/colo.c > +++ b/migration/colo.c > @@ -820,6 +820,26 @@ static void > colo_wait_handle_message(MigrationIncomingState *mis, > } > } > > +void colo_shutdown(void) > +{ > + MigrationIncomingState *mis = NULL; > + MigrationState *s = NULL; > + > + switch (get_colo_mode()) { > + case COLO_MODE_PRIMARY: > + s = migrate_get_current(); > + qemu_event_set(&s->colo_checkpoint_event); > + qemu_sem_post(&s->colo_exit_sem); > + break; > + case COLO_MODE_SECONDARY: > + mis = migration_incoming_get_current(); > + qemu_sem_post(&mis->colo_incoming_sem); > + break; > + default: > + break; > + } > +} > + > void *colo_process_incoming_thread(void *opaque) { > MigrationIncomingState *mis = opaque; diff --git a/migration/migration.c > b/migration/migration.c index abaf6f9..c0ab86e 100644 > --- a/migration/migration.c > +++ b/migration/migration.c > @@ -226,6 +226,12 @@ void migration_cancel(const Error *error) void > migration_shutdown(void) { > /* > + * When the QEMU main thread exit, the COLO thread > + * may wait a semaphore. So, we should wakeup the > + * COLO thread before migration shutdown. > + */ > + colo_shutdown(); > + /* > * Cancel the current migration - that will (eventually) > * stop the migration using this structure > */ > -- > 1.8.3.1
"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> Reviewed-by: Juan Quintela <quintela@redhat.com>
diff --git a/include/migration/colo.h b/include/migration/colo.h index 768e1f0..5fbe1a6 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(void); #endif diff --git a/migration/colo.c b/migration/colo.c index 2415325..0d3d98f 100644 --- a/migration/colo.c +++ b/migration/colo.c @@ -820,6 +820,26 @@ static void colo_wait_handle_message(MigrationIncomingState *mis, } } +void colo_shutdown(void) +{ + MigrationIncomingState *mis = NULL; + MigrationState *s = NULL; + + switch (get_colo_mode()) { + case COLO_MODE_PRIMARY: + s = migrate_get_current(); + qemu_event_set(&s->colo_checkpoint_event); + qemu_sem_post(&s->colo_exit_sem); + break; + case COLO_MODE_SECONDARY: + mis = migration_incoming_get_current(); + qemu_sem_post(&mis->colo_incoming_sem); + break; + default: + break; + } +} + void *colo_process_incoming_thread(void *opaque) { MigrationIncomingState *mis = opaque; diff --git a/migration/migration.c b/migration/migration.c index abaf6f9..c0ab86e 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -226,6 +226,12 @@ void migration_cancel(const Error *error) void migration_shutdown(void) { /* + * When the QEMU main thread exit, the COLO thread + * may wait a semaphore. So, we should wakeup the + * COLO thread before migration shutdown. + */ + colo_shutdown(); + /* * Cancel the current migration - that will (eventually) * stop the migration using this structure */