[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 03/18] Fixed a QEMU hang when guest poweroff in COLO mode
From: |
Juan Quintela |
Subject: |
[PULL 03/18] Fixed a QEMU hang when guest poweroff in COLO mode |
Date: |
Wed, 15 Dec 2021 11:32:03 +0100 |
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: Zhang Chen <chen.zhang@intel.com>
Reviewed-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
---
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 768e1f04c3..5fbe1a6d5d 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 c8fadae956..2a85504966 100644
--- a/migration/colo.c
+++ b/migration/colo.c
@@ -819,6 +819,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 abaf6f9e3d..c0ab86e9a5 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -225,6 +225,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
--
2.33.1
- [PULL 00/18] Migration 20211214 patches, Juan Quintela, 2021/12/15
- [PULL 01/18] migration/ram.c: Remove the qemu_mutex_lock in colo_flush_ram_cache., Juan Quintela, 2021/12/15
- [PULL 03/18] Fixed a QEMU hang when guest poweroff in COLO mode,
Juan Quintela <=
- [PULL 04/18] migration/colo: Optimize COLO primary node start code path, Juan Quintela, 2021/12/15
- [PULL 05/18] migration: Remove is_zero_range(), Juan Quintela, 2021/12/15
- [PULL 06/18] dump: Remove is_zero_page(), Juan Quintela, 2021/12/15
- [PULL 08/18] migration: Never call twice qemu_target_page_size(), Juan Quintela, 2021/12/15
- [PULL 02/18] migration/colo: More accurate update checkpoint time, Juan Quintela, 2021/12/15
- [PULL 11/18] multifd: The variable is only used inside the loop, Juan Quintela, 2021/12/15
- [PULL 09/18] multifd: Rename used field to num, Juan Quintela, 2021/12/15
- [PULL 07/18] multifd: Delete useless operation, Juan Quintela, 2021/12/15
- [PULL 12/18] multifd: remove used parameter from send_prepare() method, Juan Quintela, 2021/12/15
- [PULL 10/18] multifd: Add missing documention, Juan Quintela, 2021/12/15