migration: Delay start of migration main routines

We need to make sure that we have started all the multifd threads.

Signed-off-by: Juan Quintela <quintela@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
master
Juan Quintela 2018-03-07 08:40:52 +01:00
parent 60df2d4ae5
commit 36c2f8be2c
4 changed files with 10 additions and 2 deletions

View File

@ -430,7 +430,7 @@ static void migration_incoming_setup(QEMUFile *f)
qemu_file_set_blocking(f, false);
}
static void migration_incoming_process(void)
void migration_incoming_process(void)
{
Coroutine *co = qemu_coroutine_create(process_incoming_migration_co, NULL);
qemu_coroutine_enter(co);
@ -448,7 +448,7 @@ void migration_ioc_process_incoming(QIOChannel *ioc)
if (!mis->from_src_file) {
QEMUFile *f = qemu_fopen_channel_input(ioc);
migration_fd_process_incoming(f);
migration_incoming_setup(f);
return;
}
multifd_recv_new_channel(ioc);

View File

@ -200,6 +200,7 @@ void migrate_set_state(int *state, int old_state, int new_state);
void migration_fd_process_incoming(QEMUFile *f);
void migration_ioc_process_incoming(QIOChannel *ioc);
void migration_incoming_process(void);
bool migration_has_all_channels(void);

View File

@ -717,6 +717,9 @@ void multifd_recv_new_channel(QIOChannel *ioc)
qemu_thread_create(&p->thread, p->name, multifd_recv_thread, p,
QEMU_THREAD_JOINABLE);
atomic_inc(&multifd_recv_state->count);
if (multifd_recv_state->count == migrate_multifd_channels()) {
migration_incoming_process();
}
}
/**

View File

@ -170,6 +170,10 @@ static void socket_accept_incoming_migration(QIONetListener *listener,
qio_net_listener_disconnect(listener);
object_unref(OBJECT(listener));
if (!migrate_use_multifd()) {
migration_incoming_process();
}
}
}