mirror of https://github.com/xemu-project/xemu.git
migration: move wait-unplug loop to its own function
The loop is used in migration_thread() and bg_migration_thread(), so we can move it to its own function and call it from these both places. Moreover, in migration_thread() we have a wrong state transition from SETUP to ACTIVE while state could be WAIT_UNPLUG. This is correctly managed in bg_migration_thread() so use this code instead. Signed-off-by: Laurent Vivier <lvivier@redhat.com> Message-Id: <20210629155007.629086-2-lvivier@redhat.com> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Reviewed-by: Juan Quintela <quintela@redhat.com> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
This commit is contained in:
parent
b7f9afd48e
commit
fde93d99d9
|
@ -3676,6 +3676,28 @@ bool migration_rate_limit(void)
|
||||||
return urgent;
|
return urgent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* if failover devices are present, wait they are completely
|
||||||
|
* unplugged
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void qemu_savevm_wait_unplug(MigrationState *s, int old_state,
|
||||||
|
int new_state)
|
||||||
|
{
|
||||||
|
if (qemu_savevm_state_guest_unplug_pending()) {
|
||||||
|
migrate_set_state(&s->state, old_state, MIGRATION_STATUS_WAIT_UNPLUG);
|
||||||
|
|
||||||
|
while (s->state == MIGRATION_STATUS_WAIT_UNPLUG &&
|
||||||
|
qemu_savevm_state_guest_unplug_pending()) {
|
||||||
|
qemu_sem_timedwait(&s->wait_unplug_sem, 250);
|
||||||
|
}
|
||||||
|
|
||||||
|
migrate_set_state(&s->state, MIGRATION_STATUS_WAIT_UNPLUG, new_state);
|
||||||
|
} else {
|
||||||
|
migrate_set_state(&s->state, old_state, new_state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Master migration thread on the source VM.
|
* Master migration thread on the source VM.
|
||||||
* It drives the migration and pumps the data down the outgoing channel.
|
* It drives the migration and pumps the data down the outgoing channel.
|
||||||
|
@ -3722,22 +3744,10 @@ static void *migration_thread(void *opaque)
|
||||||
|
|
||||||
qemu_savevm_state_setup(s->to_dst_file);
|
qemu_savevm_state_setup(s->to_dst_file);
|
||||||
|
|
||||||
if (qemu_savevm_state_guest_unplug_pending()) {
|
qemu_savevm_wait_unplug(s, MIGRATION_STATUS_SETUP,
|
||||||
migrate_set_state(&s->state, MIGRATION_STATUS_SETUP,
|
MIGRATION_STATUS_ACTIVE);
|
||||||
MIGRATION_STATUS_WAIT_UNPLUG);
|
|
||||||
|
|
||||||
while (s->state == MIGRATION_STATUS_WAIT_UNPLUG &&
|
|
||||||
qemu_savevm_state_guest_unplug_pending()) {
|
|
||||||
qemu_sem_timedwait(&s->wait_unplug_sem, 250);
|
|
||||||
}
|
|
||||||
|
|
||||||
migrate_set_state(&s->state, MIGRATION_STATUS_WAIT_UNPLUG,
|
|
||||||
MIGRATION_STATUS_ACTIVE);
|
|
||||||
}
|
|
||||||
|
|
||||||
s->setup_time = qemu_clock_get_ms(QEMU_CLOCK_HOST) - setup_start;
|
s->setup_time = qemu_clock_get_ms(QEMU_CLOCK_HOST) - setup_start;
|
||||||
migrate_set_state(&s->state, MIGRATION_STATUS_SETUP,
|
|
||||||
MIGRATION_STATUS_ACTIVE);
|
|
||||||
|
|
||||||
trace_migration_thread_setup_complete();
|
trace_migration_thread_setup_complete();
|
||||||
|
|
||||||
|
@ -3845,21 +3855,9 @@ static void *bg_migration_thread(void *opaque)
|
||||||
qemu_savevm_state_header(s->to_dst_file);
|
qemu_savevm_state_header(s->to_dst_file);
|
||||||
qemu_savevm_state_setup(s->to_dst_file);
|
qemu_savevm_state_setup(s->to_dst_file);
|
||||||
|
|
||||||
if (qemu_savevm_state_guest_unplug_pending()) {
|
qemu_savevm_wait_unplug(s, MIGRATION_STATUS_SETUP,
|
||||||
migrate_set_state(&s->state, MIGRATION_STATUS_SETUP,
|
MIGRATION_STATUS_ACTIVE);
|
||||||
MIGRATION_STATUS_WAIT_UNPLUG);
|
|
||||||
|
|
||||||
while (s->state == MIGRATION_STATUS_WAIT_UNPLUG &&
|
|
||||||
qemu_savevm_state_guest_unplug_pending()) {
|
|
||||||
qemu_sem_timedwait(&s->wait_unplug_sem, 250);
|
|
||||||
}
|
|
||||||
|
|
||||||
migrate_set_state(&s->state, MIGRATION_STATUS_WAIT_UNPLUG,
|
|
||||||
MIGRATION_STATUS_ACTIVE);
|
|
||||||
} else {
|
|
||||||
migrate_set_state(&s->state, MIGRATION_STATUS_SETUP,
|
|
||||||
MIGRATION_STATUS_ACTIVE);
|
|
||||||
}
|
|
||||||
s->setup_time = qemu_clock_get_ms(QEMU_CLOCK_HOST) - setup_start;
|
s->setup_time = qemu_clock_get_ms(QEMU_CLOCK_HOST) - setup_start;
|
||||||
|
|
||||||
trace_migration_thread_setup_complete();
|
trace_migration_thread_setup_complete();
|
||||||
|
|
Loading…
Reference in New Issue