[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v12 2/3] migration: Create socket-address parame
From: |
Dr. David Alan Gilbert |
Subject: |
Re: [Qemu-devel] [PATCH v12 2/3] migration: Create socket-address parameter |
Date: |
Wed, 6 Feb 2019 19:56:27 +0000 |
User-agent: |
Mutt/1.10.1 (2018-07-13) |
* Juan Quintela (address@hidden) 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 <address@hidden>
>
> --
>
> 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 <address@hidden>
--
Dr. David Alan Gilbert / address@hidden / Manchester, UK