On 20.08.25 16:37, Daniel P. Berrangé wrote:
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



Ok, thanks, will do.


--
Best regards,
Vladimir

Reply via email to