Register yank functions on sockets to shut them down. Signed-off-by: Lukas Straub <lukasstra...@web.de> --- migration/migration.c | 9 +++++++++ migration/qemu-file-channel.c | 6 ++++++ migration/socket.c | 11 +++++++++++ 3 files changed, 26 insertions(+)
diff --git a/migration/migration.c b/migration/migration.c index 187ac0410c..f89fcba198 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -54,6 +54,7 @@ #include "net/announce.h" #include "qemu/queue.h" #include "multifd.h" +#include "yank.h" #define MAX_THROTTLE (32 << 20) /* Migration transfer speed throttling */ @@ -231,6 +232,8 @@ void migration_incoming_state_destroy(void) qapi_free_SocketAddressList(mis->socket_address_list); mis->socket_address_list = NULL; } + + yank_unregister_instance((char *) "migration"); } static void migrate_generate_event(int new_state) @@ -362,6 +365,7 @@ void qemu_start_incoming_migration(const char *uri, Error **errp) const char *p; qapi_event_send_migration(MIGRATION_STATUS_SETUP); + yank_register_instance((char *) "migration"); if (!strcmp(uri, "defer")) { deferred_incoming_migration(errp); } else if (strstart(uri, "tcp:", &p)) { @@ -377,6 +381,7 @@ void qemu_start_incoming_migration(const char *uri, Error **errp) } else if (strstart(uri, "fd:", &p)) { fd_start_incoming_migration(p, errp); } else { + yank_unregister_instance((char *) "migration"); error_setg(errp, "unknown migration protocol: %s", uri); } } @@ -1632,6 +1637,7 @@ static void migrate_fd_cleanup(MigrationState *s) } notifier_list_notify(&migration_state_notifiers, s); block_cleanup_parameters(s); + yank_unregister_instance((char *) "migration"); } static void migrate_fd_cleanup_schedule(MigrationState *s) @@ -2036,6 +2042,7 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk, return; } + yank_register_instance((char *) "migration"); if (strstart(uri, "tcp:", &p)) { tcp_start_outgoing_migration(s, p, &local_err); #ifdef CONFIG_RDMA @@ -2049,6 +2056,7 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk, } else if (strstart(uri, "fd:", &p)) { fd_start_outgoing_migration(s, p, &local_err); } else { + yank_unregister_instance((char *) "migration"); error_setg(errp, QERR_INVALID_PARAMETER_VALUE, "uri", "a valid migration protocol"); migrate_set_state(&s->state, MIGRATION_STATUS_SETUP, @@ -2058,6 +2066,7 @@ void qmp_migrate(const char *uri, bool has_blk, bool blk, } if (local_err) { + yank_unregister_instance((char *) "migration"); migrate_fd_error(s, local_err); error_propagate(errp, local_err); return; diff --git a/migration/qemu-file-channel.c b/migration/qemu-file-channel.c index d2ce32f4b9..6224bda029 100644 --- a/migration/qemu-file-channel.c +++ b/migration/qemu-file-channel.c @@ -27,6 +27,7 @@ #include "qemu-file.h" #include "io/channel-socket.h" #include "qemu/iov.h" +#include "yank.h" static ssize_t channel_writev_buffer(void *opaque, @@ -104,6 +105,11 @@ static int channel_close(void *opaque, Error **errp) int ret; QIOChannel *ioc = QIO_CHANNEL(opaque); ret = qio_channel_close(ioc, errp); + if (object_dynamic_cast(OBJECT(ioc), TYPE_QIO_CHANNEL_SOCKET) + && OBJECT(ioc)->ref == 2) { + yank_unregister_function((char *) "migration", yank_generic_iochannel, + QIO_CHANNEL(ioc)); + } object_unref(OBJECT(ioc)); return ret; } diff --git a/migration/socket.c b/migration/socket.c index 97c9efde59..bbca53cc49 100644 --- a/migration/socket.c +++ b/migration/socket.c @@ -26,6 +26,7 @@ #include "io/channel-socket.h" #include "io/net-listener.h" #include "trace.h" +#include "yank.h" struct SocketOutgoingArgs { @@ -35,6 +36,8 @@ struct SocketOutgoingArgs { void socket_send_channel_create(QIOTaskFunc f, void *data) { QIOChannelSocket *sioc = qio_channel_socket_new(); + yank_register_function((char *) "migration", yank_generic_iochannel, + QIO_CHANNEL(sioc)); qio_channel_socket_connect_async(sioc, outgoing_args.saddr, f, data, NULL, NULL); } @@ -42,6 +45,8 @@ void socket_send_channel_create(QIOTaskFunc f, void *data) int socket_send_channel_destroy(QIOChannel *send) { /* Remove channel */ + yank_unregister_function((char *) "migration", yank_generic_iochannel, + QIO_CHANNEL(send)); object_unref(OBJECT(send)); if (outgoing_args.saddr) { qapi_free_SocketAddress(outgoing_args.saddr); @@ -101,6 +106,8 @@ static void socket_outgoing_migration(QIOTask *task, Error *err = NULL; if (qio_task_propagate_error(task, &err)) { + yank_unregister_function((char *) "migration", yank_generic_iochannel, + QIO_CHANNEL(sioc)); trace_migration_socket_outgoing_error(error_get_pretty(err)); } else { trace_migration_socket_outgoing_connected(data->hostname); @@ -127,6 +134,8 @@ static void socket_start_outgoing_migration(MigrationState *s, } qio_channel_set_name(QIO_CHANNEL(sioc), "migration-socket-outgoing"); + yank_register_function((char *) "migration", yank_generic_iochannel, + QIO_CHANNEL(sioc)); qio_channel_socket_connect_async(sioc, saddr, socket_outgoing_migration, @@ -163,6 +172,8 @@ static void socket_accept_incoming_migration(QIONetListener *listener, trace_migration_socket_incoming_accepted(); qio_channel_set_name(QIO_CHANNEL(cioc), "migration-socket-incoming"); + yank_register_function((char *) "migration", yank_generic_iochannel, + QIO_CHANNEL(cioc)); migration_channel_process_incoming(QIO_CHANNEL(cioc)); if (migration_has_all_channels()) { -- 2.20.1
pgpFwY_XvwksK.pgp
Description: OpenPGP digital signature