[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v4 08/10] migration: process_incoming_migration_co(): move colo p
From: |
Vladimir Sementsov-Ogievskiy |
Subject: |
[PATCH v4 08/10] migration: process_incoming_migration_co(): move colo part to colo |
Date: |
Fri, 28 Apr 2023 22:49:26 +0300 |
Let's make better public interface for COLO: instead of
colo_process_incoming_thread and not trivial logic around creating the
thread let's make simple colo_incoming_co(), hiding implementation from
generic code.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
---
include/migration/colo.h | 9 ++++++++-
migration/colo.c | 39 ++++++++++++++++++++++++++++++++++++++-
migration/migration.c | 28 ++--------------------------
stubs/colo.c | 6 ++----
4 files changed, 50 insertions(+), 32 deletions(-)
diff --git a/include/migration/colo.h b/include/migration/colo.h
index 7ef315473e..eaac07f26d 100644
--- a/include/migration/colo.h
+++ b/include/migration/colo.h
@@ -28,7 +28,6 @@ bool migration_in_colo_state(void);
int migration_incoming_enable_colo(void);
void migration_incoming_disable_colo(void);
bool migration_incoming_colo_enabled(void);
-void *colo_process_incoming_thread(void *opaque);
bool migration_incoming_in_colo_state(void);
COLOMode get_colo_mode(void);
@@ -44,5 +43,13 @@ void colo_do_failover(void);
*/
void colo_checkpoint_delay_set(void);
+/*
+ * Starts COLO incoming process. Called from process_incoming_migration_co()
+ * after loading the state.
+ *
+ * Called with BQL locked, may temporary release BQL.
+ */
+int coroutine_fn colo_incoming_co(void);
+
void colo_shutdown(void);
#endif
diff --git a/migration/colo.c b/migration/colo.c
index a688ac553a..d775b442d8 100644
--- a/migration/colo.c
+++ b/migration/colo.c
@@ -817,7 +817,7 @@ void colo_shutdown(void)
}
}
-void *colo_process_incoming_thread(void *opaque)
+static void *colo_process_incoming_thread(void *opaque)
{
MigrationIncomingState *mis = opaque;
QEMUFile *fb = NULL;
@@ -918,3 +918,40 @@ out:
rcu_unregister_thread();
return NULL;
}
+
+int coroutine_fn colo_incoming_co(void)
+{
+ MigrationIncomingState *mis = migration_incoming_get_current();
+ Error *local_err = NULL;
+ QemuThread th;
+
+ assert(!qemu_mutex_iothread_locked());
+
+ if (!migration_incoming_colo_enabled()) {
+ return 0;
+ }
+
+ /* Make sure all file formats throw away their mutable metadata */
+ bdrv_activate_all(&local_err);
+ if (local_err) {
+ error_report_err(local_err);
+ return -EINVAL;
+ }
+
+ qemu_thread_create(&th, "COLO incoming", colo_process_incoming_thread,
+ mis, QEMU_THREAD_JOINABLE);
+
+ mis->colo_incoming_co = qemu_coroutine_self();
+ qemu_coroutine_yield();
+ mis->colo_incoming_co = NULL;
+
+ qemu_mutex_unlock_iothread();
+ /* Wait checkpoint incoming thread exit before free resource */
+ qemu_thread_join(&th);
+ qemu_mutex_lock_iothread();
+
+ /* We hold the global iothread lock, so it is safe here */
+ colo_release_ram_cache();
+
+ return 0;
+}
diff --git a/migration/migration.c b/migration/migration.c
index 23b2d187de..0d912ee0d7 100644
--- a/migration/migration.c
+++ b/migration/migration.c
@@ -502,7 +502,6 @@ process_incoming_migration_co(void *opaque)
MigrationIncomingState *mis = migration_incoming_get_current();
PostcopyState ps;
int ret;
- Error *local_err = NULL;
assert(mis->from_src_file);
mis->largest_page_size = qemu_ram_pagesize_largest();
@@ -540,37 +539,14 @@ process_incoming_migration_co(void *opaque)
goto fail;
}
- /* we get COLO info, and know if we are in COLO mode */
- if (migration_incoming_colo_enabled()) {
- QemuThread colo_incoming_thread;
-
- /* Make sure all file formats throw away their mutable metadata */
- bdrv_activate_all(&local_err);
- if (local_err) {
- error_report_err(local_err);
- goto fail;
- }
-
- qemu_thread_create(&colo_incoming_thread, "COLO incoming",
- colo_process_incoming_thread, mis, QEMU_THREAD_JOINABLE);
-
- mis->colo_incoming_co = qemu_coroutine_self();
- qemu_coroutine_yield();
- mis->colo_incoming_co = NULL;
-
- qemu_mutex_unlock_iothread();
- /* Wait checkpoint incoming thread exit before free resource */
- qemu_thread_join(&colo_incoming_thread);
- qemu_mutex_lock_iothread();
- /* We hold the global iothread lock, so it is safe here */
- colo_release_ram_cache();
+ if (colo_incoming_co() < 0) {
+ goto fail;
}
mis->bh = qemu_bh_new(process_incoming_migration_bh, mis);
qemu_bh_schedule(mis->bh);
return;
fail:
- local_err = NULL;
migrate_set_state(&mis->state, MIGRATION_STATUS_ACTIVE,
MIGRATION_STATUS_FAILED);
qemu_fclose(mis->from_src_file);
diff --git a/stubs/colo.c b/stubs/colo.c
index cf9816d368..f33379d0fd 100644
--- a/stubs/colo.c
+++ b/stubs/colo.c
@@ -10,11 +10,9 @@ void colo_shutdown(void)
{
}
-void *colo_process_incoming_thread(void *opaque)
+int coroutine_fn colo_incoming_co(void)
{
- error_report("Impossible happend: trying to start COLO thread when COLO "
- "module is not built in");
- abort();
+ return 0;
}
void colo_checkpoint_delay_set(void)
--
2.34.1
- [PATCH v4 00/10] COLO: improve build options, Vladimir Sementsov-Ogievskiy, 2023/04/28
- [PATCH v4 02/10] colo: make colo_checkpoint_notify static and provide simpler API, Vladimir Sementsov-Ogievskiy, 2023/04/28
- [PATCH v4 05/10] migration: drop colo_incoming_thread from MigrationIncomingState, Vladimir Sementsov-Ogievskiy, 2023/04/28
- [PATCH v4 03/10] build: move COLO under CONFIG_REPLICATION, Vladimir Sementsov-Ogievskiy, 2023/04/28
- [PATCH v4 07/10] migration: split migration_incoming_co, Vladimir Sementsov-Ogievskiy, 2023/04/28
- [PATCH v4 04/10] configure: add --disable-colo-proxy option, Vladimir Sementsov-Ogievskiy, 2023/04/28
- [PATCH v4 08/10] migration: process_incoming_migration_co(): move colo part to colo,
Vladimir Sementsov-Ogievskiy <=
- [PATCH v4 09/10] migration: disallow change capabilities in COLO state, Vladimir Sementsov-Ogievskiy, 2023/04/28
- [PATCH v4 10/10] migration: block incoming colo when capability is disabled, Vladimir Sementsov-Ogievskiy, 2023/04/28
- [PATCH v4 06/10] migration: process_incoming_migration_co: simplify code flow around ret, Vladimir Sementsov-Ogievskiy, 2023/04/28
- [PATCH v4 01/10] block/meson.build: prefer positive condition for replication, Vladimir Sementsov-Ogievskiy, 2023/04/28