On Wed, Aug 13, 2025 at 07:48:47PM +0300, Vladimir Sementsov-Ogievskiy wrote: > Add a possibility to keep socket non-block status when passing > through qio channel. We need this to support migration of open > fds through migration channel. > > Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@yandex-team.ru> > --- > include/io/channel-socket.h | 3 +++ > io/channel-socket.c | 16 ++++++++++++---- > 2 files changed, 15 insertions(+), 4 deletions(-) > > diff --git a/include/io/channel-socket.h b/include/io/channel-socket.h > index a88cf8b3a9..0a4327d745 100644 > --- a/include/io/channel-socket.h > +++ b/include/io/channel-socket.h > @@ -49,6 +49,7 @@ struct QIOChannelSocket { > socklen_t remoteAddrLen; > ssize_t zero_copy_queued; > ssize_t zero_copy_sent; > + bool keep_nonblock; > }; > > > @@ -275,4 +276,6 @@ int qio_channel_socket_set_send_buffer(QIOChannelSocket > *ioc, > size_t size, > Error **errp); > > +void qio_channel_socket_keep_nonblock(QIOChannel *ioc); > + > #endif /* QIO_CHANNEL_SOCKET_H */ > diff --git a/io/channel-socket.c b/io/channel-socket.c > index 3b7ca924ff..cd93d7f180 100644 > --- a/io/channel-socket.c > +++ b/io/channel-socket.c > @@ -462,9 +462,16 @@ static void qio_channel_socket_finalize(Object *obj) > } > > > +void qio_channel_socket_keep_nonblock(QIOChannel *ioc) > +{ > + QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(ioc); > + sioc->keep_nonblock = true; > +} > + > + > #ifndef WIN32 > static void qio_channel_socket_copy_fds(struct msghdr *msg, > - int **fds, size_t *nfds) > + int **fds, size_t *nfds, bool > set_block) > { > struct cmsghdr *cmsg; > > @@ -497,8 +504,9 @@ static void qio_channel_socket_copy_fds(struct msghdr > *msg, > continue; > } > > - /* O_NONBLOCK is preserved across SCM_RIGHTS so reset it */ > - qemu_socket_set_block(fd); > + if (set_block) { > + qemu_socket_set_block(fd); > + } > > #ifndef MSG_CMSG_CLOEXEC > qemu_set_cloexec(fd); > @@ -556,7 +564,7 @@ static ssize_t qio_channel_socket_readv(QIOChannel *ioc, > } > > if (fds && nfds) { > - qio_channel_socket_copy_fds(&msg, fds, nfds); > + qio_channel_socket_copy_fds(&msg, fds, nfds, !sioc->keep_nonblock); > } > > return ret;
If this is needed, then it should be done by defining another flag constant to be passed to qio_channel_read*, not via a new API QIO_CHANNEL_READ_FLAG_FD_PRESERVE_NONBLOCKING With regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|