Re: [RFC PATCH net-next v6 00/14] virtio/vsock: support datagrams

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Amery,

On Wed, Jul 10, 2024 at 09:25:41PM GMT, Amery Hung wrote:
Hey all!

This series introduces support for datagrams to virtio/vsock.

It is a spin-off (and smaller version) of this series from the summer:
 https://lore.kernel.org/all/cover.1660362668.git.bobby.eshleman@xxxxxxxxxxxxx/

Cool! Thanks for restarting this work!


Please note that this is an RFC and should not be merged until
associated changes are made to the virtio specification, which will
follow after discussion from this series.

Another aside, the v4 of the series has only been mildly tested with a
run of tools/testing/vsock/vsock_test. Some code likely needs cleaning
up, but I'm hoping to get some of the design choices agreed upon before
spending too much time making it pretty.

What are the main points where you would like an agreement?


This series first supports datagrams in a basic form for virtio, and
then optimizes the sendpath for all datagram transports.

What kind of optimization?


The result is a very fast datagram communication protocol that
outperforms even UDP on multi-queue virtio-net w/ vhost on a variety
of multi-threaded workload samples.

For those that are curious, some summary data comparing UDP and VSOCK
DGRAM (N=5):

	vCPUS: 16
	virtio-net queues: 16
	payload size: 4KB
	Setup: bare metal + vm (non-nested)

	UDP: 287.59 MB/s
	VSOCK DGRAM: 509.2 MB/s

Nice!

I have not tested because the series does not compile as has already been pointed out, I will test the next version.


Some notes about the implementation...

This datagram implementation forces datagrams to self-throttle according
to the threshold set by sk_sndbuf. It behaves similar to the credits
used by streams in its effect on throughput and memory consumption, but
it is not influenced by the receiving socket as credits are.

The device drops packets silently.

As discussed previously, this series introduces datagrams and defers
fairness to future work. See discussion in v2 for more context around
datagrams, fairness, and this implementation.

So IIUC we are re-using the same virtqueues used by stream/seqpacket, right?

I did a fast review, there's something to fix, but it looks like this can work well, so I'd start to discuss virtio spec changes ASAP.

Thanks,
Stefano


Signed-off-by: Bobby Eshleman <bobby.eshleman@xxxxxxxxxxxxx>
Signed-off-by: Amery Hung <amery.hung@xxxxxxxxxxxxx>
---
Changes in v6:
- allow empty transport in datagram vsock
- add empty transport checks in various paths
- transport layer now saves source cid and port to control buffer of skb
 to remove the dependency of transport in recvmsg()
- fix virtio dgram_enqueue() by looking up the transport to be used when
 using sendto(2)
- fix skb memory leaks in two places
- add dgram auto-bind test
- Link to v5: https://lore.kernel.org/r/20230413-b4-vsock-dgram-v5-0-581bd37fdb26@xxxxxxxxxxxxx

Changes in v5:
- teach vhost to drop dgram when a datagram exceeds the receive buffer
 - now uses MSG_ERRQUEUE and depends on Arseniy's zerocopy patch:
	"vsock: read from socket's error queue"
- replace multiple ->dgram_* callbacks with single ->dgram_addr_init()
 callback
- refactor virtio dgram skb allocator to reduce conflicts w/ zerocopy series
- add _fallback/_FALLBACK suffix to dgram transport variables/macros
- add WARN_ONCE() for table_size / VSOCK_HASH issue
- add static to vsock_find_bound_socket_common
- dedupe code in vsock_dgram_sendmsg() using module_got var
- drop concurrent sendmsg() for dgram and defer to future series
- Add more tests
 - test EHOSTUNREACH in errqueue
 - test stream + dgram address collision
- improve clarity of dgram msg bounds test code
- Link to v4: https://lore.kernel.org/r/20230413-b4-vsock-dgram-v4-0-0cebbb2ae899@xxxxxxxxxxxxx

Changes in v4:
- style changes
 - vsock: use sk_vsock(vsk) in vsock_dgram_recvmsg instead of
   &sk->vsk
 - vsock: fix xmas tree declaration
 - vsock: fix spacing issues
 - virtio/vsock: virtio_transport_recv_dgram returns void because err
   unused
- sparse analysis warnings/errors
 - virtio/vsock: fix unitialized skerr on destroy
 - virtio/vsock: fix uninitialized err var on goto out
 - vsock: fix declarations that need static
 - vsock: fix __rcu annotation order
- bugs
 - vsock: fix null ptr in remote_info code
 - vsock/dgram: make transport_dgram a fallback instead of first
   priority
 - vsock: remove redundant rcu read lock acquire in getname()
- tests
 - add more tests (message bounds and more)
 - add vsock_dgram_bind() helper
 - add vsock_dgram_connect() helper

Changes in v3:
- Support multi-transport dgram, changing logic in connect/bind
 to support VMCI case
- Support per-pkt transport lookup for sendto() case
- Fix dgram_allow() implementation
- Fix dgram feature bit number (now it is 3)
- Fix binding so dgram and connectible (cid,port) spaces are
 non-overlapping
- RCU protect transport ptr so connect() calls never leave
 a lockless read of the transport and remote_addr are always
 in sync
- Link to v2: https://lore.kernel.org/r/20230413-b4-vsock-dgram-v2-0-079cc7cee62e@xxxxxxxxxxxxx


Bobby Eshleman (14):
 af_vsock: generalize vsock_dgram_recvmsg() to all transports
 af_vsock: refactor transport lookup code
 af_vsock: support multi-transport datagrams
 af_vsock: generalize bind table functions
 af_vsock: use a separate dgram bind table
 virtio/vsock: add VIRTIO_VSOCK_TYPE_DGRAM
 virtio/vsock: add common datagram send path
 af_vsock: add vsock_find_bound_dgram_socket()
 virtio/vsock: add common datagram recv path
 virtio/vsock: add VIRTIO_VSOCK_F_DGRAM feature bit
 vhost/vsock: implement datagram support
 vsock/loopback: implement datagram support
 virtio/vsock: implement datagram support
 test/vsock: add vsock dgram tests

drivers/vhost/vsock.c                   |   62 +-
include/linux/virtio_vsock.h            |    9 +-
include/net/af_vsock.h                  |   24 +-
include/uapi/linux/virtio_vsock.h       |    2 +
net/vmw_vsock/af_vsock.c                |  343 ++++++--
net/vmw_vsock/hyperv_transport.c        |   13 -
net/vmw_vsock/virtio_transport.c        |   24 +-
net/vmw_vsock/virtio_transport_common.c |  188 ++++-
net/vmw_vsock/vmci_transport.c          |   61 +-
net/vmw_vsock/vsock_loopback.c          |    9 +-
tools/testing/vsock/util.c              |  177 +++-
tools/testing/vsock/util.h              |   10 +
tools/testing/vsock/vsock_test.c        | 1032 ++++++++++++++++++++---
13 files changed, 1638 insertions(+), 316 deletions(-)

--
2.20.1






[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux