All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 1/2] QIOChannelSocket: Introduce assert and reduce ifdefs to improve readability
@ 2022-06-14  5:17 Leonardo Bras
  2022-06-14  5:17 ` [PATCH v3 2/2] QIOChannelSocket: Fix zero-copy send so socket flush works Leonardo Bras
  2022-06-14  8:38 ` [PATCH v3 1/2] QIOChannelSocket: Introduce assert and reduce ifdefs to improve readability Daniel P. Berrangé
  0 siblings, 2 replies; 4+ messages in thread
From: Leonardo Bras @ 2022-06-14  5:17 UTC (permalink / raw)
  To: Daniel P. Berrangé, Peter Xu, 徐闯,
	David Gilbert, Juan Quintela
  Cc: Leonardo Bras, qemu-devel

During implementation of MSG_ZEROCOPY feature, a lot of #ifdefs were
introduced, particularly at qio_channel_socket_writev().

Rewrite some of those changes so it's easier to read.

Also, introduce an assert to help detect incorrect zero-copy usage is when
it's disabled on build.

Signed-off-by: Leonardo Bras <leobras@redhat.com>
---
 io/channel-socket.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/io/channel-socket.c b/io/channel-socket.c
index dc9c165de1..cdce7b0b45 100644
--- a/io/channel-socket.c
+++ b/io/channel-socket.c
@@ -578,11 +578,13 @@ static ssize_t qio_channel_socket_writev(QIOChannel *ioc,
         memcpy(CMSG_DATA(cmsg), fds, fdsize);
     }
 
-#ifdef QEMU_MSG_ZEROCOPY
     if (flags & QIO_CHANNEL_WRITE_FLAG_ZERO_COPY) {
+#ifdef QEMU_MSG_ZEROCOPY
         sflags = MSG_ZEROCOPY;
-    }
+#else
+        g_assert_unreachable();
 #endif
+    }
 
  retry:
     ret = sendmsg(sioc->fd, &msg, sflags);
@@ -592,15 +594,13 @@ static ssize_t qio_channel_socket_writev(QIOChannel *ioc,
             return QIO_CHANNEL_ERR_BLOCK;
         case EINTR:
             goto retry;
-#ifdef QEMU_MSG_ZEROCOPY
         case ENOBUFS:
-            if (sflags & MSG_ZEROCOPY) {
+            if (flags & QIO_CHANNEL_WRITE_FLAG_ZERO_COPY) {
                 error_setg_errno(errp, errno,
                                  "Process can't lock enough memory for using MSG_ZEROCOPY");
                 return -1;
             }
             break;
-#endif
         }
 
         error_setg_errno(errp, errno,
-- 
2.36.1



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v3 2/2] QIOChannelSocket: Fix zero-copy send so socket flush works
  2022-06-14  5:17 [PATCH v3 1/2] QIOChannelSocket: Introduce assert and reduce ifdefs to improve readability Leonardo Bras
@ 2022-06-14  5:17 ` Leonardo Bras
  2022-06-14  8:38   ` Daniel P. Berrangé
  2022-06-14  8:38 ` [PATCH v3 1/2] QIOChannelSocket: Introduce assert and reduce ifdefs to improve readability Daniel P. Berrangé
  1 sibling, 1 reply; 4+ messages in thread
From: Leonardo Bras @ 2022-06-14  5:17 UTC (permalink / raw)
  To: Daniel P. Berrangé, Peter Xu, 徐闯,
	David Gilbert, Juan Quintela
  Cc: Leonardo Bras, qemu-devel

Somewhere between v6 and v7 the of the zero-copy-send patchset a crucial
part of the flushing mechanism got missing: incrementing zero_copy_queued.

Without that, the flushing interface becomes a no-op, and there is no
guarantee the buffer is really sent.

This can go as bad as causing a corruption in RAM during migration.

Fixes: 2bc58ffc2926 ("QIOChannelSocket: Implement io_writev zero copy flag & io_flush for CONFIG_LINUX")
Reported-by: 徐闯 <xuchuangxclwt@bytedance.com>
Signed-off-by: Leonardo Bras <leobras@redhat.com>
---
 io/channel-socket.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/io/channel-socket.c b/io/channel-socket.c
index cdce7b0b45..f31dd189a5 100644
--- a/io/channel-socket.c
+++ b/io/channel-socket.c
@@ -607,6 +607,11 @@ static ssize_t qio_channel_socket_writev(QIOChannel *ioc,
                          "Unable to write to socket");
         return -1;
     }
+
+    if (flags & QIO_CHANNEL_WRITE_FLAG_ZERO_COPY) {
+        sioc->zero_copy_queued++;
+    }
+
     return ret;
 }
 #else /* WIN32 */
-- 
2.36.1



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v3 1/2] QIOChannelSocket: Introduce assert and reduce ifdefs to improve readability
  2022-06-14  5:17 [PATCH v3 1/2] QIOChannelSocket: Introduce assert and reduce ifdefs to improve readability Leonardo Bras
  2022-06-14  5:17 ` [PATCH v3 2/2] QIOChannelSocket: Fix zero-copy send so socket flush works Leonardo Bras
@ 2022-06-14  8:38 ` Daniel P. Berrangé
  1 sibling, 0 replies; 4+ messages in thread
From: Daniel P. Berrangé @ 2022-06-14  8:38 UTC (permalink / raw)
  To: Leonardo Bras
  Cc: Peter Xu, 徐闯, David Gilbert, Juan Quintela, qemu-devel

On Tue, Jun 14, 2022 at 02:17:25AM -0300, Leonardo Bras wrote:
> During implementation of MSG_ZEROCOPY feature, a lot of #ifdefs were
> introduced, particularly at qio_channel_socket_writev().
> 
> Rewrite some of those changes so it's easier to read.
> 
> Also, introduce an assert to help detect incorrect zero-copy usage is when
> it's disabled on build.
> 
> Signed-off-by: Leonardo Bras <leobras@redhat.com>
> ---
>  io/channel-socket.c | 10 +++++-----
>  1 file changed, 5 insertions(+), 5 deletions(-)
> 
> diff --git a/io/channel-socket.c b/io/channel-socket.c
> index dc9c165de1..cdce7b0b45 100644
> --- a/io/channel-socket.c
> +++ b/io/channel-socket.c
> @@ -578,11 +578,13 @@ static ssize_t qio_channel_socket_writev(QIOChannel *ioc,
>          memcpy(CMSG_DATA(cmsg), fds, fdsize);
>      }
>  
> -#ifdef QEMU_MSG_ZEROCOPY
>      if (flags & QIO_CHANNEL_WRITE_FLAG_ZERO_COPY) {
> +#ifdef QEMU_MSG_ZEROCOPY
>          sflags = MSG_ZEROCOPY;
> -    }
> +#else

I would just add a comment:

         /* We expect QIOChannel class entry point to have
	    blocked this code path already */

> +        g_assert_unreachable();
>  #endif
> +    }
>  
>   retry:
>      ret = sendmsg(sioc->fd, &msg, sflags);
> @@ -592,15 +594,13 @@ static ssize_t qio_channel_socket_writev(QIOChannel *ioc,
>              return QIO_CHANNEL_ERR_BLOCK;
>          case EINTR:
>              goto retry;
> -#ifdef QEMU_MSG_ZEROCOPY
>          case ENOBUFS:
> -            if (sflags & MSG_ZEROCOPY) {
> +            if (flags & QIO_CHANNEL_WRITE_FLAG_ZERO_COPY) {
>                  error_setg_errno(errp, errno,
>                                   "Process can't lock enough memory for using MSG_ZEROCOPY");
>                  return -1;
>              }
>              break;
> -#endif
>          }
>  
>          error_setg_errno(errp, errno,

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


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 :|



^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH v3 2/2] QIOChannelSocket: Fix zero-copy send so socket flush works
  2022-06-14  5:17 ` [PATCH v3 2/2] QIOChannelSocket: Fix zero-copy send so socket flush works Leonardo Bras
@ 2022-06-14  8:38   ` Daniel P. Berrangé
  0 siblings, 0 replies; 4+ messages in thread
From: Daniel P. Berrangé @ 2022-06-14  8:38 UTC (permalink / raw)
  To: Leonardo Bras
  Cc: Peter Xu, 徐闯, David Gilbert, Juan Quintela, qemu-devel

On Tue, Jun 14, 2022 at 02:17:26AM -0300, Leonardo Bras wrote:
> Somewhere between v6 and v7 the of the zero-copy-send patchset a crucial
> part of the flushing mechanism got missing: incrementing zero_copy_queued.
> 
> Without that, the flushing interface becomes a no-op, and there is no
> guarantee the buffer is really sent.
> 
> This can go as bad as causing a corruption in RAM during migration.
> 
> Fixes: 2bc58ffc2926 ("QIOChannelSocket: Implement io_writev zero copy flag & io_flush for CONFIG_LINUX")
> Reported-by: 徐闯 <xuchuangxclwt@bytedance.com>
> Signed-off-by: Leonardo Bras <leobras@redhat.com>
> ---
>  io/channel-socket.c | 5 +++++
>  1 file changed, 5 insertions(+)

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>


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 :|



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2022-06-14  8:42 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-14  5:17 [PATCH v3 1/2] QIOChannelSocket: Introduce assert and reduce ifdefs to improve readability Leonardo Bras
2022-06-14  5:17 ` [PATCH v3 2/2] QIOChannelSocket: Fix zero-copy send so socket flush works Leonardo Bras
2022-06-14  8:38   ` Daniel P. Berrangé
2022-06-14  8:38 ` [PATCH v3 1/2] QIOChannelSocket: Introduce assert and reduce ifdefs to improve readability Daniel P. Berrangé

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.