migration: Create socket-address parameter

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.

Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>
Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
  dgilbert: Removed DummyStruct as suggested by Eric & Markus

--
This commit is contained in:
Juan Quintela 2019-02-27 11:51:27 +01:00 committed by Dr. David Alan Gilbert
parent cdf842299d
commit 9aca82ba31
5 changed files with 77 additions and 1 deletions

33
hmp.c
View File

@ -166,6 +166,27 @@ void hmp_info_mice(Monitor *mon, const QDict *qdict)
qapi_free_MouseInfoList(mice_list); 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);
case SOCKET_ADDRESS_TYPE_UNIX:
return g_strdup_printf("unix:%s",
addr->u.q_unix.path);
case SOCKET_ADDRESS_TYPE_FD:
return g_strdup_printf("fd:%s", addr->u.fd.str);
case SOCKET_ADDRESS_TYPE_VSOCK:
return g_strdup_printf("tcp:%s:%s",
addr->u.vsock.cid,
addr->u.vsock.port);
default:
return g_strdup("unknown address type");
}
}
void hmp_info_migrate(Monitor *mon, const QDict *qdict) void hmp_info_migrate(Monitor *mon, const QDict *qdict)
{ {
MigrationInfo *info; MigrationInfo *info;
@ -306,6 +327,18 @@ void hmp_info_migrate(Monitor *mon, const QDict *qdict)
g_free(str); g_free(str);
visit_free(v); 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) {
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_MigrationInfo(info);
qapi_free_MigrationCapabilityStatusList(caps); qapi_free_MigrationCapabilityStatusList(caps);
} }

View File

@ -31,6 +31,8 @@
#include "migration/vmstate.h" #include "migration/vmstate.h"
#include "block/block.h" #include "block/block.h"
#include "qapi/error.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-commands-migration.h"
#include "qapi/qapi-events-migration.h" #include "qapi/qapi-events-migration.h"
#include "qapi/qmp/qerror.h" #include "qapi/qmp/qerror.h"
@ -213,6 +215,11 @@ void migration_incoming_state_destroy(void)
} }
qemu_event_reset(&mis->main_thread_load_event); qemu_event_reset(&mis->main_thread_load_event);
if (mis->socket_address_list) {
qapi_free_SocketAddressList(mis->socket_address_list);
mis->socket_address_list = NULL;
}
} }
static void migrate_generate_event(int new_state) static void migrate_generate_event(int new_state)
@ -328,6 +335,17 @@ void migration_incoming_enable_colo(void)
migration_colo_enabled = true; 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_list;
mis->socket_address_list = addrs;
addrs->value = QAPI_CLONE(SocketAddress, address);
}
void qemu_start_incoming_migration(const char *uri, Error **errp) void qemu_start_incoming_migration(const char *uri, Error **errp)
{ {
const char *p; const char *p;
@ -1009,6 +1027,12 @@ static void fill_destination_migration_info(MigrationInfo *info)
{ {
MigrationIncomingState *mis = migration_incoming_get_current(); MigrationIncomingState *mis = migration_incoming_get_current();
if (mis->socket_address_list) {
info->has_socket_address = true;
info->socket_address =
QAPI_CLONE(SocketAddressList, mis->socket_address_list);
}
switch (mis->state) { switch (mis->state) {
case MIGRATION_STATUS_NONE: case MIGRATION_STATUS_NONE:
return; return;

View File

@ -84,6 +84,9 @@ struct MigrationIncomingState {
bool postcopy_recover_triggered; bool postcopy_recover_triggered;
QemuSemaphore postcopy_pause_sem_dst; QemuSemaphore postcopy_pause_sem_dst;
QemuSemaphore postcopy_pause_sem_fault; QemuSemaphore postcopy_pause_sem_fault;
/* List of listening socket addresses */
SocketAddressList *socket_address_list;
}; };
MigrationIncomingState *migration_incoming_get_current(void); MigrationIncomingState *migration_incoming_get_current(void);
@ -305,6 +308,7 @@ void migrate_send_rp_resume_ack(MigrationIncomingState *mis, uint32_t value);
void dirty_bitmap_mig_before_vm_start(void); void dirty_bitmap_mig_before_vm_start(void);
void init_dirty_bitmap_incoming_migration(void); void init_dirty_bitmap_incoming_migration(void);
void migrate_add_address(SocketAddress *address);
int foreach_not_ignored_block(RAMBlockIterFunc func, void *opaque); int foreach_not_ignored_block(RAMBlockIterFunc func, void *opaque);

View File

@ -15,6 +15,7 @@
*/ */
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "qemu/cutils.h"
#include "qemu-common.h" #include "qemu-common.h"
#include "qemu/error-report.h" #include "qemu/error-report.h"
@ -177,6 +178,7 @@ static void socket_start_incoming_migration(SocketAddress *saddr,
Error **errp) Error **errp)
{ {
QIONetListener *listener = qio_net_listener_new(); QIONetListener *listener = qio_net_listener_new();
size_t i;
qio_net_listener_set_name(listener, "migration-socket-listener"); 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, socket_accept_incoming_migration,
NULL, NULL, NULL, NULL,
g_main_context_get_thread_default()); 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) void tcp_start_incoming_migration(const char *host_port, Error **errp)

View File

@ -6,6 +6,7 @@
## ##
{ 'include': 'common.json' } { 'include': 'common.json' }
{ 'include': 'sockets.json' }
## ##
# @MigrationStats: # @MigrationStats:
@ -199,6 +200,8 @@
# @compression: migration compression statistics, only returned if compression # @compression: migration compression statistics, only returned if compression
# feature is on and status is 'active' or 'completed' (Since 3.1) # 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 # Since: 0.14.0
## ##
{ 'struct': 'MigrationInfo', { 'struct': 'MigrationInfo',
@ -213,7 +216,8 @@
'*error-desc': 'str', '*error-desc': 'str',
'*postcopy-blocktime' : 'uint32', '*postcopy-blocktime' : 'uint32',
'*postcopy-vcpu-blocktime': ['uint32'], '*postcopy-vcpu-blocktime': ['uint32'],
'*compression': 'CompressionStats'} } '*compression': 'CompressionStats',
'*socket-address': ['SocketAddress'] } }
## ##
# @query-migrate: # @query-migrate: