* Juan Quintela (quint...@redhat.com) wrote: > It will be used to store the uri parameters. We want this only for > tcp, so we don't set it for other uris. We need it to know what port > is migration running. > > Signed-off-by: Juan Quintela <quint...@redhat.com> > > -- > > This used to be uri parameter, but it has so many troubles to > reproduce that it don't just make sense. > > This used to be a port parameter. I was asked to move to > SocketAddress, done. > I also merged the setting of the migration tcp port in this one > because now I need to free the address, and this makes it easier. > This used to be x-socket-address with a single direction, now it is a > list of addresses. > Move SocketAddress_to_str here. I used to try to generalize the one > in chardev/char-socket.c, but it is not worth it. > > Free string (eric) > Handle VSOCK address nicely (not that migration can use them yet). > --- > hmp.c | 37 +++++++++++++++++++++++++++++++++++++ > migration/migration.c | 24 ++++++++++++++++++++++++ > migration/migration.h | 4 ++++ > migration/socket.c | 11 +++++++++++ > qapi/migration.json | 6 +++++- > qapi/sockets.json | 13 +++++++++++++ > 6 files changed, 94 insertions(+), 1 deletion(-) > > diff --git a/hmp.c b/hmp.c > index b2a2b1f84e..63019729ed 100644 > --- a/hmp.c > +++ b/hmp.c > @@ -166,6 +166,31 @@ void hmp_info_mice(Monitor *mon, const QDict *qdict) > qapi_free_MouseInfoList(mice_list); > } > > +static char *SocketAddress_to_str(SocketAddress *addr) > +{ > + switch (addr->type) { > + case SOCKET_ADDRESS_TYPE_INET: > + return g_strdup_printf("tcp:%s:%s", > + addr->u.inet.host, > + addr->u.inet.port); > + break;
(Minor) You don't need the 'break's with the return. > + case SOCKET_ADDRESS_TYPE_UNIX: > + return g_strdup_printf("unix:%s", > + addr->u.q_unix.path); > + break; > + case SOCKET_ADDRESS_TYPE_FD: > + return g_strdup_printf("fd:%s", addr->u.fd.str); > + break; > + case SOCKET_ADDRESS_TYPE_VSOCK: > + return g_strdup_printf("tcp:%s:%s", > + addr->u.vsock.cid, > + addr->u.vsock.port); > + break; > + default: > + return g_strdup("unknown adrress type"); Typo in 'ad*r*ress' Can be fixed in commit. > + } > +} > + > void hmp_info_migrate(Monitor *mon, const QDict *qdict) > { > MigrationInfo *info; > @@ -306,6 +331,18 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict) > g_free(str); > visit_free(v); > } > + if (info->has_socket_address) { > + SocketAddressList *addr; > + > + monitor_printf(mon, "socket address: [\n"); > + > + for (addr = info->socket_address; addr; addr = addr->next) { I guess you could use the visitors to walk that list; but it may be more painful than it's worth. > + char *s = SocketAddress_to_str(addr->value); > + monitor_printf(mon, "\t%s\n", s); > + g_free(s); > + } > + monitor_printf(mon, "]\n"); > + } > qapi_free_MigrationInfo(info); > qapi_free_MigrationCapabilityStatusList(caps); > } > diff --git a/migration/migration.c b/migration/migration.c > index 37e06b76dc..ef1d53cde2 100644 > --- a/migration/migration.c > +++ b/migration/migration.c > @@ -31,6 +31,8 @@ > #include "migration/vmstate.h" > #include "block/block.h" > #include "qapi/error.h" > +#include "qapi/clone-visitor.h" > +#include "qapi/qapi-visit-sockets.h" > #include "qapi/qapi-commands-migration.h" > #include "qapi/qapi-events-migration.h" > #include "qapi/qmp/qerror.h" > @@ -197,6 +199,11 @@ void migration_incoming_state_destroy(void) > } > > qemu_event_reset(&mis->main_thread_load_event); > + > + if (mis->socket_address) { > + qapi_free_SocketAddressList(mis->socket_address); > + mis->socket_address = NULL; > + } > } > > static void migrate_generate_event(int new_state) > @@ -312,6 +319,17 @@ void migration_incoming_enable_colo(void) > migration_colo_enabled = true; > } > > +void migrate_add_address(SocketAddress *address) > +{ > + MigrationIncomingState *mis = migration_incoming_get_current(); > + SocketAddressList *addrs; > + > + addrs = g_new0(SocketAddressList, 1); > + addrs->next = mis->socket_address; > + mis->socket_address = addrs; > + addrs->value = QAPI_CLONE(SocketAddress, address); > +} > + > void qemu_start_incoming_migration(const char *uri, Error **errp) > { > const char *p; > @@ -966,6 +984,12 @@ static void > fill_destination_migration_info(MigrationInfo *info) > { > MigrationIncomingState *mis = migration_incoming_get_current(); > > + if (mis->socket_address) { > + info->has_socket_address = true; > + info->socket_address = > + QAPI_CLONE(SocketAddressList, mis->socket_address); > + } > + > switch (mis->state) { > case MIGRATION_STATUS_NONE: > return; > diff --git a/migration/migration.h b/migration/migration.h > index dcd05d9f87..bd41b57af9 100644 > --- a/migration/migration.h > +++ b/migration/migration.h > @@ -80,6 +80,9 @@ struct MigrationIncomingState { > bool postcopy_recover_triggered; > QemuSemaphore postcopy_pause_sem_dst; > QemuSemaphore postcopy_pause_sem_fault; > + > + /* List of listening socket addresses */ > + SocketAddressList *socket_address; It's slightly confusing to have a list of addresses called 'socket_address'. > }; > > MigrationIncomingState *migration_incoming_get_current(void); > @@ -300,6 +303,7 @@ void migrate_send_rp_resume_ack(MigrationIncomingState > *mis, uint32_t value); > > void dirty_bitmap_mig_before_vm_start(void); > void init_dirty_bitmap_incoming_migration(void); > +void migrate_add_address(SocketAddress *address); > > #define qemu_ram_foreach_block \ > #warning "Use qemu_ram_foreach_block_migratable in migration code" > diff --git a/migration/socket.c b/migration/socket.c > index f4c8174400..239527fb1f 100644 > --- a/migration/socket.c > +++ b/migration/socket.c > @@ -15,6 +15,7 @@ > */ > > #include "qemu/osdep.h" > +#include "qemu/cutils.h" > > #include "qemu-common.h" > #include "qemu/error-report.h" > @@ -177,6 +178,7 @@ static void socket_start_incoming_migration(SocketAddress > *saddr, > Error **errp) > { > QIONetListener *listener = qio_net_listener_new(); > + size_t i; > > qio_net_listener_set_name(listener, "migration-socket-listener"); > > @@ -189,6 +191,15 @@ static void > socket_start_incoming_migration(SocketAddress *saddr, > socket_accept_incoming_migration, > NULL, NULL, > > g_main_context_get_thread_default()); > + > + for (i = 0; i < listener->nsioc; i++) { > + SocketAddress *address = > + qio_channel_socket_get_local_address(listener->sioc[i], errp); > + if (!address) { > + return; > + } > + migrate_add_address(address); > + } > } > > void tcp_start_incoming_migration(const char *host_port, Error **errp) > diff --git a/qapi/migration.json b/qapi/migration.json > index 7a795ecc16..b62947791f 100644 > --- a/qapi/migration.json > +++ b/qapi/migration.json > @@ -6,6 +6,7 @@ > ## > > { 'include': 'common.json' } > +{ 'include': 'sockets.json' } > > ## > # @MigrationStats: > @@ -199,6 +200,8 @@ > # @compression: migration compression statistics, only returned if > compression > # feature is on and status is 'active' or 'completed' (Since 3.1) > # > +# @socket-address: Only used for tcp, to know what the real port is (Since > 4.0) > +# > # Since: 0.14.0 > ## > { 'struct': 'MigrationInfo', > @@ -213,7 +216,8 @@ > '*error-desc': 'str', > '*postcopy-blocktime' : 'uint32', > '*postcopy-vcpu-blocktime': ['uint32'], > - '*compression': 'CompressionStats'} } > + '*compression': 'CompressionStats', > + '*socket-address': ['SocketAddress'] } } > > ## > # @query-migrate: > diff --git a/qapi/sockets.json b/qapi/sockets.json > index fc81d8d5e8..d7f77984af 100644 > --- a/qapi/sockets.json > +++ b/qapi/sockets.json > @@ -152,3 +152,16 @@ > 'unix': 'UnixSocketAddress', > 'vsock': 'VsockSocketAddress', > 'fd': 'String' } } > + > +## > +# @DummyStruct: > +# > +# Both block-core and migration needs SocketAddressList > +# I am open to comments about how to share it > +# > +# @dummy-list: A dummy list > +# > +# Since: 3.1 > +## > +{ 'struct': 'DummyStruct', > + 'data': { 'dummy-list': ['SocketAddress'] } } > -- > 2.20.1 All the above are minor, so: Reviewed-by: Dr. David Alan Gilbert <dgilb...@redhat.com> -- Dr. David Alan Gilbert / dgilb...@redhat.com / Manchester, UK