Re: [PATCH RFC 0/8] vsock: add datagram support to virtio and vhost
flat view
From: Alexei Starovoitov <hidden>
Date: 2026-10-28 17:25:33
Also in:
bpf, kvm, linux-hyperv, lkml, netdev
On Wed, Oct 28, 2026 at 09:04 AM Sergio Lopez [off-list ref] wrote:
This series implements SOCK_DGRAM support for virtio-vsock and vhost-vsock, allowing applications to exchange connectionless messages through the existing AF_VSOCK datagram API.
The cover doesn't say who needs it. Bobby and Amery took the same feature to v6: https://lore.kernel.org/all/20240710212555.1617795-1-amery.hung@bytedance.com/ (local) Stefano said there that it can work well and that the virtio spec change is the next step. The last mails of the thread have Amery's v7 WIP and a short list of what is left. The cover doesn't mention it. The spec change is still missing. Why not finish v7 instead ? This RFC goes the other way in these places: what v6 this RFC ----------------- ------------------------ ---------------------------- (cid, port) space own bind table for dgram shared with stream. The 2nd bind() gets EADDRINUSE vsk->transport empty until connect(), g2h or h2g, picked in lookup per packet socket(). -ENODEV with vsock_loopback only routing one helper for stream 2nd copy of the chain in and dgram vsock_assign_transport() recvmsg() in af_vsock.c, dgram_dequeue() stays, no dgram_dequeue() dgram_payload_len() is new VMCI fallback first. No virtio dgram when its module is loaded dgram > RX buffer drop, EHOSTUNREACH in every RX buffer is 64K the error queue
Datagrams use destination-based routing across guest-to-host, host-to-guest and loopback transports while retaining the socket's transport state. VMCI keeps priority as the dedicated datagram
A dgram socket uses two members of struct virtio_vsock_sock: tx_lock and
bytes_unsent. They serve SIOCOUTQ only.
virtio_transport_alloc_skb() does skb_set_owner_w() already.
udp_ioctl() returns sk_wmem_alloc_get() for SIOCOUTQ.
Without them a dgram socket has no transport state, like in v6.
Then no need for the owner transport, dgram_transport_match(),
fallback_transport, tx_accounted, the skb destructor, etc.
transport. Guest RX buffers accommodate complete messages when datagrams are negotiated, preserving message boundaries.
That's 64K per RX buffer instead of 4K, for stream and seqpacket too. It undoes commit 03a92f036a04 ("vsock/virtio: Resize receive buffers so that each SKB fits in a 4K page"). pskb_trim_unique() doesn't reduce skb->truesize. So a datagram of 1 byte charges more than 64K to sk_rmem_alloc of the guest socket. The default sk_rcvbuf is about 208K on x86-64. The 5th datagram in the queue is dropped.