diff --git a/migration/migration.c b/migration/migration.c index 2d4c56e612a5b8f07d40dac3d2d89845b98c9470..bac4a99277cf96a9cc2bd2c2761a18ce1bffae13 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -384,6 +384,17 @@ void migration_ioc_process_incoming(QIOChannel *ioc) /* We still only have a single channel. Nothing to do here yet */ } +/** + * @migration_has_all_channels: We have received all channels that we need + * + * Returns true when we have got connections to all the channels that + * we need for migration. + */ +bool migration_has_all_channels(void) +{ + return true; +} + /* * Send a 'SHUT' message on the return channel with the given value * to indicate that we've finished with the RP. Non-0 value indicates diff --git a/migration/migration.h b/migration/migration.h index 99c398d484686cd12caab5199d092a4c15b6acf1..1881e4a754fdc239791152148da30d85ebe5bde7 100644 --- a/migration/migration.h +++ b/migration/migration.h @@ -155,6 +155,8 @@ 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); +bool migration_has_all_channels(void); + uint64_t migrate_max_downtime(void); void migrate_fd_error(MigrationState *s, const Error *error); diff --git a/migration/socket.c b/migration/socket.c index b02d37d7a35ae8b22db4852b8c93a039e4e70e26..dee869044a55542ae3f89a9ee012c8fa24b4c558 100644 --- a/migration/socket.c +++ b/migration/socket.c @@ -152,9 +152,13 @@ static gboolean socket_accept_incoming_migration(QIOChannel *ioc, object_unref(OBJECT(sioc)); out: - /* Close listening socket as its no longer needed */ - qio_channel_close(ioc, NULL); - return G_SOURCE_REMOVE; + if (migration_has_all_channels()) { + /* Close listening socket as its no longer needed */ + qio_channel_close(ioc, NULL); + return G_SOURCE_REMOVE; + } else { + return G_SOURCE_CONTINUE; + } }