public inbox for passt-dev@passt.top
 help / color / mirror / code / Atom feed
* [PATCH v2 00/10] vhost-user: Preparatory series for multiple iovec entries per virtqueue element
@ 2026-04-03 16:38 Laurent Vivier
  2026-04-03 16:38 ` [PATCH v2 01/10] iov: Introduce iov_memset() Laurent Vivier
                   ` (9 more replies)
  0 siblings, 10 replies; 11+ messages in thread
From: Laurent Vivier @ 2026-04-03 16:38 UTC (permalink / raw)
  To: passt-dev; +Cc: Laurent Vivier

Currently, the vhost-user path assumes each virtqueue element contains
exactly one iovec entry covering the entire frame.  This assumption
breaks as some virtio-net drivers (notably iPXE) provide descriptors where the
vnet header and the frame payload are in separate buffers, resulting in
two iovec entries per virtqueue element.

This series refactors the vhost-user data path so that frame lengths,
header sizes, and padding are tracked and passed explicitly rather than
being derived from iovec sizes.  This decoupling is a prerequisite for
correctly handling padding of multi-buffer frames.

The changes in this series can be split in 3 groups:

- New iov helpers (patches 1-2):

   iov_memset() and iov_memcopy() operate across iovec boundaries.
   These are needed by the final patch to pad and copy frame data
   when a frame spans multiple iovec entries.

- Structural refactoring (patches 3-5):

   Move vnethdr setup into vu_flush(), separate virtqueue management
   from socket I/O in the UDP path, and pass iov arrays explicitly
   instead of using file-scoped state.  These changes make it possible
   to pass explicit frame lengths through the stack, which is required
   to pad frames independently of iovec layout.

- Explicit length passing throughout the stack (patches 6-10):

   Thread explicit L4, L2, frame, and data lengths through checksum,
   pcap, vu_flush(), and tcp_fill_headers(), replacing lengths that
   were previously derived from iovec sizes.  With lengths tracked
   explicitly, the final patch can centralise Ethernet frame padding
   into vu_collect() and a new vu_pad() helper that correctly pads
   frames spanning multiple iovec entries.

v2:
- Rename iov_memcopy() to iov_memcpy() and use clearer parameter names
- Use clearer code in pcap_frame()
- Add braces around bodies in pcap.c and tcp_vu.c for style consistency
- Extract l2len variable in tap_add_packet() and tcp_vu_send_flag()
  to avoid repeating the same expression
- Fix indentation alignment of iov_skip_bytes() arguments in tcp_vu_c
- Introduce fill_size variable in vu_flush()
- Reposition comment for ETH_ZLEN in vu_collect()

Laurent Vivier (10):
  iov: Introduce iov_memset()
  iov: Add iov_memcpy() to copy data between iovec arrays
  vu_common: Move vnethdr setup into vu_flush()
  udp_vu: Move virtqueue management from udp_vu_sock_recv() to its
    caller
  udp_vu: Pass iov explicitly to helpers instead of using file-scoped
    array
  checksum: Pass explicit L4 length to checksum functions
  pcap: Pass explicit L2 length to pcap_iov()
  vu_common: Pass explicit frame length to vu_flush()
  tcp: Pass explicit data length to tcp_fill_headers()
  vhost-user: Centralise Ethernet frame padding in vu_collect() and
    vu_pad()

 checksum.c     |  35 ++++++-----
 checksum.h     |   6 +-
 iov.c          |  78 ++++++++++++++++++++++++
 iov.h          |   5 ++
 pcap.c         |  41 ++++++++++---
 pcap.h         |   2 +-
 tap.c          |   7 ++-
 tcp.c          |  14 +++--
 tcp_buf.c      |   3 +-
 tcp_internal.h |   2 +-
 tcp_vu.c       |  66 ++++++++++----------
 udp.c          |   5 +-
 udp_vu.c       | 162 ++++++++++++++++++++++++++-----------------------
 vu_common.c    |  58 ++++++++++--------
 vu_common.h    |   5 +-
 15 files changed, 311 insertions(+), 178 deletions(-)

-- 
2.53.0


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

end of thread, other threads:[~2026-04-03 16:38 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-04-03 16:38 [PATCH v2 00/10] vhost-user: Preparatory series for multiple iovec entries per virtqueue element Laurent Vivier
2026-04-03 16:38 ` [PATCH v2 01/10] iov: Introduce iov_memset() Laurent Vivier
2026-04-03 16:38 ` [PATCH v2 02/10] iov: Add iov_memcpy() to copy data between iovec arrays Laurent Vivier
2026-04-03 16:38 ` [PATCH v2 03/10] vu_common: Move vnethdr setup into vu_flush() Laurent Vivier
2026-04-03 16:38 ` [PATCH v2 04/10] udp_vu: Move virtqueue management from udp_vu_sock_recv() to its caller Laurent Vivier
2026-04-03 16:38 ` [PATCH v2 05/10] udp_vu: Pass iov explicitly to helpers instead of using file-scoped array Laurent Vivier
2026-04-03 16:38 ` [PATCH v2 06/10] checksum: Pass explicit L4 length to checksum functions Laurent Vivier
2026-04-03 16:38 ` [PATCH v2 07/10] pcap: Pass explicit L2 length to pcap_iov() Laurent Vivier
2026-04-03 16:38 ` [PATCH v2 08/10] vu_common: Pass explicit frame length to vu_flush() Laurent Vivier
2026-04-03 16:38 ` [PATCH v2 09/10] tcp: Pass explicit data length to tcp_fill_headers() Laurent Vivier
2026-04-03 16:38 ` [PATCH v2 10/10] vhost-user: Centralise Ethernet frame padding in vu_collect() and vu_pad() Laurent Vivier

Code repositories for project(s) associated with this public inbox

	https://passt.top/passt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for IMAP folder(s).