On Tue, Mar 23, 2021 at 9:54 PM Lukas Straub wrote: > Remove dependency on qiochannel by removing yank_generic_iochannel and > letting migration and chardev use their own yank function for > iochannel. > > Signed-off-by: Lukas Straub > Reviewed-by: Marc-André Lureau --- > MAINTAINERS | 1 + > chardev/char-socket.c | 21 ++++++++++++++------- > include/qemu/yank.h | 10 ---------- > migration/channel.c | 6 ++++-- > migration/meson.build | 1 + > migration/multifd.c | 3 ++- > migration/qemu-file-channel.c | 3 ++- > migration/yank_functions.c | 20 ++++++++++++++++++++ > migration/yank_functions.h | 17 +++++++++++++++++ > stubs/yank.c | 6 ------ > util/yank.c | 8 -------- > 11 files changed, 61 insertions(+), 35 deletions(-) > create mode 100644 migration/yank_functions.c > create mode 100644 migration/yank_functions.h > > diff --git a/MAINTAINERS b/MAINTAINERS > index 9147e9a429..455775c4a3 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -2821,6 +2821,7 @@ M: Lukas Straub > S: Odd fixes > F: util/yank.c > F: stubs/yank.c > +F: migration/yank_functions* > F: include/qemu/yank.h > F: qapi/yank.json > > diff --git a/chardev/char-socket.c b/chardev/char-socket.c > index f618bdec28..1d455ecca4 100644 > --- a/chardev/char-socket.c > +++ b/chardev/char-socket.c > @@ -402,6 +402,13 @@ static void remove_hup_source(SocketChardev *s) > } > } > > +static void char_socket_yank_iochannel(void *opaque) > +{ > + QIOChannel *ioc = QIO_CHANNEL(opaque); > + > + qio_channel_shutdown(ioc, QIO_CHANNEL_SHUTDOWN_BOTH, NULL); > +} > + > static void tcp_chr_free_connection(Chardev *chr) > { > SocketChardev *s = SOCKET_CHARDEV(chr); > @@ -424,7 +431,7 @@ static void tcp_chr_free_connection(Chardev *chr) > (s->state == TCP_CHARDEV_STATE_CONNECTING > || s->state == TCP_CHARDEV_STATE_CONNECTED)) { > yank_unregister_function(CHARDEV_YANK_INSTANCE(chr->label), > - yank_generic_iochannel, > + char_socket_yank_iochannel, > QIO_CHANNEL(s->sioc)); > } > object_unref(OBJECT(s->sioc)); > @@ -946,7 +953,7 @@ static int tcp_chr_add_client(Chardev *chr, int fd) > tcp_chr_set_client_ioc_name(chr, sioc); > if (s->registered_yank) { > yank_register_function(CHARDEV_YANK_INSTANCE(chr->label), > - yank_generic_iochannel, > + char_socket_yank_iochannel, > QIO_CHANNEL(sioc)); > } > ret = tcp_chr_new_client(chr, sioc); > @@ -965,7 +972,7 @@ static void tcp_chr_accept(QIONetListener *listener, > tcp_chr_set_client_ioc_name(chr, cioc); > if (s->registered_yank) { > yank_register_function(CHARDEV_YANK_INSTANCE(chr->label), > - yank_generic_iochannel, > + char_socket_yank_iochannel, > QIO_CHANNEL(cioc)); > } > tcp_chr_new_client(chr, cioc); > @@ -985,7 +992,7 @@ static int tcp_chr_connect_client_sync(Chardev *chr, > Error **errp) > } > if (s->registered_yank) { > yank_register_function(CHARDEV_YANK_INSTANCE(chr->label), > - yank_generic_iochannel, > + char_socket_yank_iochannel, > QIO_CHANNEL(sioc)); > } > tcp_chr_new_client(chr, sioc); > @@ -1005,7 +1012,7 @@ static void tcp_chr_accept_server_sync(Chardev *chr) > tcp_chr_set_client_ioc_name(chr, sioc); > if (s->registered_yank) { > yank_register_function(CHARDEV_YANK_INSTANCE(chr->label), > - yank_generic_iochannel, > + char_socket_yank_iochannel, > QIO_CHANNEL(sioc)); > } > tcp_chr_new_client(chr, sioc); > @@ -1138,7 +1145,7 @@ static void qemu_chr_socket_connected(QIOTask *task, > void *opaque) > tcp_chr_change_state(s, TCP_CHARDEV_STATE_DISCONNECTED); > if (s->registered_yank) { > yank_unregister_function(CHARDEV_YANK_INSTANCE(chr->label), > - yank_generic_iochannel, > + char_socket_yank_iochannel, > QIO_CHANNEL(sioc)); > } > check_report_connect_error(chr, err); > @@ -1176,7 +1183,7 @@ static void tcp_chr_connect_client_async(Chardev > *chr) > tcp_chr_set_client_ioc_name(chr, sioc); > if (s->registered_yank) { > yank_register_function(CHARDEV_YANK_INSTANCE(chr->label), > - yank_generic_iochannel, > + char_socket_yank_iochannel, > QIO_CHANNEL(sioc)); > } > /* > diff --git a/include/qemu/yank.h b/include/qemu/yank.h > index 5b93c70cbf..5375a1f195 100644 > --- a/include/qemu/yank.h > +++ b/include/qemu/yank.h > @@ -73,16 +73,6 @@ void yank_unregister_function(const YankInstance > *instance, > YankFn *func, > void *opaque); > > -/** > - * yank_generic_iochannel: Generic yank function for iochannel > - * > - * This is a generic yank function which will call qio_channel_shutdown > on the > - * provided QIOChannel. > - * > - * @opaque: QIOChannel to shutdown > - */ > -void yank_generic_iochannel(void *opaque); > - > #define BLOCKDEV_YANK_INSTANCE(the_node_name) (&(YankInstance) { \ > .type = YANK_INSTANCE_TYPE_BLOCK_NODE, \ > .u.block_node.node_name = (the_node_name) }) > diff --git a/migration/channel.c b/migration/channel.c > index 35fe234e9c..c9ee902021 100644 > --- a/migration/channel.c > +++ b/migration/channel.c > @@ -20,6 +20,7 @@ > #include "io/channel-tls.h" > #include "io/channel-socket.h" > #include "qemu/yank.h" > +#include "yank_functions.h" > > /** > * @migration_channel_process_incoming - Create new incoming migration > channel > @@ -38,7 +39,8 @@ void migration_channel_process_incoming(QIOChannel *ioc) > ioc, object_get_typename(OBJECT(ioc))); > > if (object_dynamic_cast(OBJECT(ioc), TYPE_QIO_CHANNEL_SOCKET)) { > - yank_register_function(MIGRATION_YANK_INSTANCE, > yank_generic_iochannel, > + yank_register_function(MIGRATION_YANK_INSTANCE, > + migration_yank_iochannel, > QIO_CHANNEL(ioc)); > } > > @@ -76,7 +78,7 @@ void migration_channel_connect(MigrationState *s, > if (!error) { > if (object_dynamic_cast(OBJECT(ioc), TYPE_QIO_CHANNEL_SOCKET)) { > yank_register_function(MIGRATION_YANK_INSTANCE, > - yank_generic_iochannel, > + migration_yank_iochannel, > QIO_CHANNEL(ioc)); > } > > diff --git a/migration/meson.build b/migration/meson.build > index 9645f44005..2cfa8eed72 100644 > --- a/migration/meson.build > +++ b/migration/meson.build > @@ -6,6 +6,7 @@ migration_files = files( > 'vmstate.c', > 'qemu-file-channel.c', > 'qemu-file.c', > + 'yank_functions.c', > ) > softmmu_ss.add(migration_files) > > diff --git a/migration/multifd.c b/migration/multifd.c > index 03527c564c..a6677c45c8 100644 > --- a/migration/multifd.c > +++ b/migration/multifd.c > @@ -27,6 +27,7 @@ > > #include "qemu/yank.h" > #include "io/channel-socket.h" > +#include "yank_functions.h" > > /* Multiple fd's */ > > @@ -989,7 +990,7 @@ int multifd_load_cleanup(Error **errp) > if (object_dynamic_cast(OBJECT(p->c), TYPE_QIO_CHANNEL_SOCKET) > && OBJECT(p->c)->ref == 1) { > yank_unregister_function(MIGRATION_YANK_INSTANCE, > - yank_generic_iochannel, > + migration_yank_iochannel, > QIO_CHANNEL(p->c)); > } > > diff --git a/migration/qemu-file-channel.c b/migration/qemu-file-channel.c > index afc3a7f642..876d05a540 100644 > --- a/migration/qemu-file-channel.c > +++ b/migration/qemu-file-channel.c > @@ -28,6 +28,7 @@ > #include "io/channel-socket.h" > #include "qemu/iov.h" > #include "qemu/yank.h" > +#include "yank_functions.h" > > > static ssize_t channel_writev_buffer(void *opaque, > @@ -108,7 +109,7 @@ static int channel_close(void *opaque, Error **errp) > if (object_dynamic_cast(OBJECT(ioc), TYPE_QIO_CHANNEL_SOCKET) > && OBJECT(ioc)->ref == 1) { > yank_unregister_function(MIGRATION_YANK_INSTANCE, > - yank_generic_iochannel, > + migration_yank_iochannel, > QIO_CHANNEL(ioc)); > } > object_unref(OBJECT(ioc)); > diff --git a/migration/yank_functions.c b/migration/yank_functions.c > new file mode 100644 > index 0000000000..96c90e17dc > --- /dev/null > +++ b/migration/yank_functions.c > @@ -0,0 +1,20 @@ > +/* > + * migration yank functions > + * > + * Copyright (c) Lukas Straub > + * > + * This work is licensed under the terms of the GNU GPL, version 2 or > later. > + * See the COPYING file in the top-level directory. > + */ > + > +#include "qemu/osdep.h" > +#include "qapi/error.h" > +#include "io/channel.h" > +#include "yank_functions.h" > + > +void migration_yank_iochannel(void *opaque) > +{ > + QIOChannel *ioc = QIO_CHANNEL(opaque); > + > + qio_channel_shutdown(ioc, QIO_CHANNEL_SHUTDOWN_BOTH, NULL); > +} > diff --git a/migration/yank_functions.h b/migration/yank_functions.h > new file mode 100644 > index 0000000000..055ea22523 > --- /dev/null > +++ b/migration/yank_functions.h > @@ -0,0 +1,17 @@ > +/* > + * migration yank functions > + * > + * Copyright (c) Lukas Straub > + * > + * This work is licensed under the terms of the GNU GPL, version 2 or > later. > + * See the COPYING file in the top-level directory. > + */ > + > +/** > + * migration_yank_iochannel: yank function for iochannel > + * > + * This yank function will call qio_channel_shutdown on the provided > QIOChannel. > + * > + * @opaque: QIOChannel to shutdown > + */ > +void migration_yank_iochannel(void *opaque); > diff --git a/stubs/yank.c b/stubs/yank.c > index 6090416065..11b24fc057 100644 > --- a/stubs/yank.c > +++ b/stubs/yank.c > @@ -21,9 +21,3 @@ void yank_unregister_function(const YankInstance > *instance, > void *opaque) > { > } > - > -void yank_generic_iochannel(void *opaque) > -{ > -} > - > - > diff --git a/util/yank.c b/util/yank.c > index fc08f65209..abf47c346d 100644 > --- a/util/yank.c > +++ b/util/yank.c > @@ -15,7 +15,6 @@ > #include "qapi/qapi-commands-yank.h" > #include "qapi/qapi-visit-yank.h" > #include "qapi/clone-visitor.h" > -#include "io/channel.h" > #include "qemu/yank.h" > > struct YankFuncAndParam { > @@ -151,13 +150,6 @@ void yank_unregister_function(const YankInstance > *instance, > abort(); > } > > -void yank_generic_iochannel(void *opaque) > -{ > - QIOChannel *ioc = QIO_CHANNEL(opaque); > - > - qio_channel_shutdown(ioc, QIO_CHANNEL_SHUTDOWN_BOTH, NULL); > -} > - > void qmp_yank(YankInstanceList *instances, > Error **errp) > { > -- > 2.30.2 > > -- Marc-André Lureau