diff options
| author | Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> | 2023-05-15 16:06:40 +0300 |
|---|---|---|
| committer | Juan Quintela <quintela@redhat.com> | 2023-05-18 18:40:51 +0200 |
| commit | d0a14a2ba01c7b200e6ce3e7979e1ed3ede1d5c7 (patch) | |
| tree | d1ea02b4b95b9946d28a3c4e37f0c93d6584f065 /migration/colo.c | |
| parent | dd42ce24a3cda4be3c839aceb91fdf85e31c194f (diff) | |
| download | focaccia-qemu-d0a14a2ba01c7b200e6ce3e7979e1ed3ede1d5c7.tar.gz focaccia-qemu-d0a14a2ba01c7b200e6ce3e7979e1ed3ede1d5c7.zip | |
migration: process_incoming_migration_co(): move colo part to colo
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> Reviewed-by: Juan Quintela <quintela@redhat.com> Message-Id: <20230515130640.46035-4-vsementsov@yandex-team.ru> Signed-off-by: Juan Quintela <quintela@redhat.com>
Diffstat (limited to 'migration/colo.c')
| -rw-r--r-- | migration/colo.c | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/migration/colo.c b/migration/colo.c index a688ac553a..72f4f7b37e 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; +} |