qemu-devel
[Top][All Lists]
Advanced

[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: Juan Quintela
Subject: Re: [Qemu-devel] [PATCH v12 2/3] migration: Create socket-address parameter
Date: Wed, 20 Feb 2019 11:05:10 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux)

"Dr. David Alan Gilbert" <address@hidden> wrote:
> * 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.

oops.  Fixed.

>> +    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.

Done.

>> +    }
>> +}
>> +
>>  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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]