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> --- 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); + } /* * Cancel the current migration - that will (eventually) * stop the migration using this structure -- 1.8.3.1