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>
This commit is contained in:
parent
dd42ce24a3
commit
d0a14a2ba0
@ -28,7 +28,6 @@ bool migration_in_colo_state(void);
|
|||||||
int migration_incoming_enable_colo(void);
|
int migration_incoming_enable_colo(void);
|
||||||
void migration_incoming_disable_colo(void);
|
void migration_incoming_disable_colo(void);
|
||||||
bool migration_incoming_colo_enabled(void);
|
bool migration_incoming_colo_enabled(void);
|
||||||
void *colo_process_incoming_thread(void *opaque);
|
|
||||||
bool migration_incoming_in_colo_state(void);
|
bool migration_incoming_in_colo_state(void);
|
||||||
|
|
||||||
COLOMode get_colo_mode(void);
|
COLOMode get_colo_mode(void);
|
||||||
@ -44,5 +43,13 @@ void colo_do_failover(void);
|
|||||||
*/
|
*/
|
||||||
void colo_checkpoint_delay_set(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);
|
void colo_shutdown(void);
|
||||||
#endif
|
#endif
|
||||||
|
@ -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;
|
MigrationIncomingState *mis = opaque;
|
||||||
QEMUFile *fb = NULL;
|
QEMUFile *fb = NULL;
|
||||||
@ -918,3 +918,40 @@ out:
|
|||||||
rcu_unregister_thread();
|
rcu_unregister_thread();
|
||||||
return NULL;
|
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;
|
||||||
|
}
|
||||||
|
@ -511,7 +511,6 @@ process_incoming_migration_co(void *opaque)
|
|||||||
MigrationIncomingState *mis = migration_incoming_get_current();
|
MigrationIncomingState *mis = migration_incoming_get_current();
|
||||||
PostcopyState ps;
|
PostcopyState ps;
|
||||||
int ret;
|
int ret;
|
||||||
Error *local_err = NULL;
|
|
||||||
|
|
||||||
assert(mis->from_src_file);
|
assert(mis->from_src_file);
|
||||||
|
|
||||||
@ -555,37 +554,14 @@ process_incoming_migration_co(void *opaque)
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we get COLO info, and know if we are in COLO mode */
|
if (colo_incoming_co() < 0) {
|
||||||
if (migration_incoming_colo_enabled()) {
|
goto fail;
|
||||||
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();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mis->bh = qemu_bh_new(process_incoming_migration_bh, mis);
|
mis->bh = qemu_bh_new(process_incoming_migration_bh, mis);
|
||||||
qemu_bh_schedule(mis->bh);
|
qemu_bh_schedule(mis->bh);
|
||||||
return;
|
return;
|
||||||
fail:
|
fail:
|
||||||
local_err = NULL;
|
|
||||||
migrate_set_state(&mis->state, MIGRATION_STATUS_ACTIVE,
|
migrate_set_state(&mis->state, MIGRATION_STATUS_ACTIVE,
|
||||||
MIGRATION_STATUS_FAILED);
|
MIGRATION_STATUS_FAILED);
|
||||||
qemu_fclose(mis->from_src_file);
|
qemu_fclose(mis->from_src_file);
|
||||||
|
@ -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 "
|
return 0;
|
||||||
"module is not built in");
|
|
||||||
abort();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void colo_checkpoint_delay_set(void)
|
void colo_checkpoint_delay_set(void)
|
||||||
|
Loading…
Reference in New Issue
Block a user