Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Vladimir Sementsov-Ogievskiy authored and Juan Quintela committed May 18, 2023
1 parent dd42ce2 commit d0a14a2
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 32 deletions.
9 changes: 8 additions & 1 deletion include/migration/colo.h
Expand Up @@ -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);
Expand All @@ -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
39 changes: 38 additions & 1 deletion migration/colo.c
Expand Up @@ -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;
Expand Down Expand Up @@ -918,3 +918,40 @@ void *colo_process_incoming_thread(void *opaque)
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;
}
28 changes: 2 additions & 26 deletions migration/migration.c
Expand Up @@ -511,7 +511,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);

Expand Down Expand Up @@ -555,37 +554,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);
Expand Down
6 changes: 2 additions & 4 deletions stubs/colo.c
Expand Up @@ -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)
Expand Down

0 comments on commit d0a14a2

Please sign in to comment.