On Tue, Jun 23, 2026 at 06:38:19PM +0300, Arseniy Krasnov wrote:
> Logically it was based on TCP implementation, so to make further support
> easier, rewrite it in the TCP way (like in 'tcp_sendmsg_locked()'). This
> patch only rewrites flag handling (e.g. it doesn't change logic).
> 
> Signed-off-by: Arseniy Krasnov <[email protected]>


It seems to change logic though:

> ---
>  Changelog v1->v2:
>  * Rebase on last 'net-next'. Don't need 'skb_zcopy_set()' now - it was
>    already added.
>  Changelog v2->v3:
>  * Update commit message.
>  * Remove one empty line.
> 
>  net/vmw_vsock/virtio_transport_common.c | 47 ++++++++++++-------------
>  1 file changed, 22 insertions(+), 25 deletions(-)
> 
> diff --git a/net/vmw_vsock/virtio_transport_common.c 
> b/net/vmw_vsock/virtio_transport_common.c
> index 09475007165b..41c2a0b82a8e 100644
> --- a/net/vmw_vsock/virtio_transport_common.c
> +++ b/net/vmw_vsock/virtio_transport_common.c
> @@ -328,38 +328,35 @@ static int virtio_transport_send_pkt_info(struct 
> vsock_sock *vsk,
>       if (pkt_len == 0 && info->op == VIRTIO_VSOCK_OP_RW)
>               return pkt_len;
>  
> -     if (info->msg) {
> -             /* If zerocopy is not enabled by 'setsockopt()', we behave as
> -              * there is no MSG_ZEROCOPY flag set.
> +     if (info->msg && (info->msg->msg_flags & MSG_ZEROCOPY)) {
> +             /* If 'info->msg' is not NULL, this is only VIRTIO_VSOCK_OP_RW.
> +              * 'MSG_ZEROCOPY' flag handling here is based on the same flag
> +              * handling from 'tcp_sendmsg_locked()'.
>                */
> -             if (!sock_flag(sk_vsock(vsk), SOCK_ZEROCOPY))
> -                     info->msg->msg_flags &= ~MSG_ZEROCOPY;

So previously without SOCK_ZEROCOPY, MSG_ZEROCOPY was always ignored...


> +             if (info->msg->msg_ubuf) {
> +                     uarg = info->msg->msg_ubuf;
> +                     can_zcopy = virtio_transport_can_zcopy(t_ops, info, 
> pkt_len);

now it's not in this case?


Maybe the right call, but saying "does not change logic" seems wrong.


> +             } else if (sock_flag(sk_vsock(vsk), SOCK_ZEROCOPY)) {
> +                     uarg = msg_zerocopy_realloc(sk_vsock(vsk), pkt_len,
> +                                                 NULL, false);
> +                     if (!uarg) {
> +                             virtio_transport_put_credit(vvs, pkt_len);
> +                             return -ENOMEM;
> +                     }
>  
> -             if (info->msg->msg_flags & MSG_ZEROCOPY)
>                       can_zcopy = virtio_transport_can_zcopy(t_ops, info, 
> pkt_len);
> +                     if (!can_zcopy)
> +                             uarg_to_msgzc(uarg)->zerocopy = 0;
>  
> +                     have_uref = true;
> +             }
> +
> +             /* 'can_zcopy' means that this transmission will be
> +              * in zerocopy way (e.g. using 'frags' array).
> +              */
>               if (can_zcopy)
>                       max_skb_len = min_t(u32, VIRTIO_VSOCK_MAX_PKT_BUF_SIZE,
>                                           (MAX_SKB_FRAGS * PAGE_SIZE));
> -
> -             if (info->msg->msg_flags & MSG_ZEROCOPY &&
> -                 info->op == VIRTIO_VSOCK_OP_RW) {
> -                     uarg = info->msg->msg_ubuf;
> -
> -                     if (!uarg) {
> -                             uarg = msg_zerocopy_realloc(sk_vsock(vsk),
> -                                                         pkt_len, NULL, 
> false);
> -                             if (!uarg) {
> -                                     virtio_transport_put_credit(vvs, 
> pkt_len);
> -                                     return -ENOMEM;
> -                             }
> -
> -                             if (!can_zcopy)
> -                                     uarg_to_msgzc(uarg)->zerocopy = 0;
> -
> -                             have_uref = true;
> -                     }
> -             }
>       }
>  
>       rest_len = pkt_len;
> -- 
> 2.25.1


Reply via email to