From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: passt.top; dmarc=none (p=none dis=none) header.from=gibson.dropbear.id.au Authentication-Results: passt.top; dkim=pass (2048-bit key; secure) header.d=gibson.dropbear.id.au header.i=@gibson.dropbear.id.au header.a=rsa-sha256 header.s=202602 header.b=Asm8wSiw; dkim-atps=neutral Received: from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3]) by passt.top (Postfix) with ESMTPS id 347545A0269 for ; Mon, 13 Apr 2026 03:44:30 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=202602; t=1776044666; bh=P7iaicn2is6ZZBz7CtDVv5JmzmgHtw4iBoEJk68hSfg=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=Asm8wSiwwiCYFntd8JGzteeA+0deU6KBUs2+B7rjlrptwFdw1Y3wJvtbtx1/thwHZ JvzRgd/12LQuaRmHXSgGeqM+NdOjhIruqOOA8XKJ0CcIGtlB7eb1pz+IrQOXd+FHvc oU4yK0U5drh7eWUpbMXvJe/JrCv6TtSFdHnMRwKz3mpctX70azhmV766P1izsGvc9s v+XMW9MJG2bO8t+SR/skPFiEzUwGSTwoiKnXoQ8e5TZA8XtCb6/VvTIRLuFkWFlQv3 p2DRcHh0b/orLdgW+GzqfayO2gOit6UlsxY8L5eTs97sT5ut1tCDdHAFaN/50WwYNA gHV1ZePhu1uNA== Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4fv9F62Njxz4wHs; Mon, 13 Apr 2026 11:44:26 +1000 (AEST) Date: Mon, 13 Apr 2026 11:40:39 +1000 From: David Gibson To: Laurent Vivier Subject: Re: [PATCH v7 1/3] udp_vu: Allow virtqueue elements with multiple iovec entries Message-ID: References: <20260403164241.3212528-1-lvivier@redhat.com> <20260403164241.3212528-2-lvivier@redhat.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="TrEm/m21r/PDhr7s" Content-Disposition: inline In-Reply-To: <20260403164241.3212528-2-lvivier@redhat.com> Message-ID-Hash: B74UTQFE3ZXCAOYF43PGPR5QCCPX37U7 X-Message-ID-Hash: B74UTQFE3ZXCAOYF43PGPR5QCCPX37U7 X-MailFrom: dgibson@gandalf.ozlabs.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: passt-dev@passt.top X-Mailman-Version: 3.3.8 Precedence: list List-Id: Development discussion and patches for passt Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: --TrEm/m21r/PDhr7s Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Fri, Apr 03, 2026 at 06:42:39PM +0200, Laurent Vivier wrote: > The previous code assumed a 1:1 mapping between virtqueue elements and > iovec entries (enforced by an assert). Drop that assumption to allow > elements that span multiple iovecs: track elem_used separately by > walking the element list against the iov count returned after padding. > This also fixes vu_queue_rewind() and vu_flush() to use the element > count rather than the iov count. >=20 > Use iov_tail_clone() in udp_vu_sock_recv() to handle header offset, > replacing the manual base/len adjustment and restore pattern. >=20 > Signed-off-by: Laurent Vivier Reviewed-by: David Gibson > --- > udp_vu.c | 31 ++++++++++++++++--------------- > 1 file changed, 16 insertions(+), 15 deletions(-) >=20 > diff --git a/udp_vu.c b/udp_vu.c > index 30af64034516..16086e6c0c03 100644 > --- a/udp_vu.c > +++ b/udp_vu.c > @@ -64,30 +64,25 @@ static size_t udp_vu_hdrlen(bool v6) > */ > static ssize_t udp_vu_sock_recv(struct iovec *iov, size_t *cnt, int s, b= ool v6) > { > + struct iovec msg_iov[*cnt]; > struct msghdr msg =3D { 0 }; > + struct iov_tail payload; > size_t hdrlen, iov_used; > ssize_t dlen; > =20 > /* compute L2 header length */ > hdrlen =3D udp_vu_hdrlen(v6); > =20 > - /* reserve space for the headers */ > - assert(iov[0].iov_len >=3D MAX(hdrlen, ETH_ZLEN + VNET_HLEN)); > - iov[0].iov_base =3D (char *)iov[0].iov_base + hdrlen; > - iov[0].iov_len -=3D hdrlen; > + payload =3D IOV_TAIL(iov, *cnt, hdrlen); > =20 > - /* read data from the socket */ > - msg.msg_iov =3D iov; > - msg.msg_iovlen =3D *cnt; > + msg.msg_iov =3D msg_iov; > + msg.msg_iovlen =3D iov_tail_clone(msg.msg_iov, payload.cnt, &payload); > =20 > + /* read data from the socket */ > dlen =3D recvmsg(s, &msg, 0); > if (dlen < 0) > return -1; > =20 > - /* restore the pointer to the headers address */ > - iov[0].iov_base =3D (char *)iov[0].iov_base - hdrlen; > - iov[0].iov_len +=3D hdrlen; > - > iov_used =3D iov_skip_bytes(iov, *cnt, > MAX(dlen + hdrlen, VNET_HLEN + ETH_ZLEN), > NULL); > @@ -205,7 +200,7 @@ void udp_vu_sock_to_tap(const struct ctx *c, int s, i= nt n, flow_sidx_t tosidx) > } > =20 > for (i =3D 0; i < n; i++) { > - unsigned elem_cnt, elem_used; > + unsigned elem_cnt, elem_used, j, k; > size_t iov_cnt; > ssize_t dlen; > =20 > @@ -215,15 +210,21 @@ void udp_vu_sock_to_tap(const struct ctx *c, int s,= int n, flow_sidx_t tosidx) > if (elem_cnt =3D=3D 0) > break; > =20 > - assert((size_t)elem_cnt =3D=3D iov_cnt); /* one iovec per element */ > - > dlen =3D udp_vu_sock_recv(iov_vu, &iov_cnt, s, v6); > if (dlen < 0) { > vu_queue_rewind(vq, elem_cnt); > break; > } > =20 > - elem_used =3D iov_cnt; /* one iovec per element */ > + elem_used =3D 0; > + for (j =3D 0, k =3D 0; k < iov_cnt && j < elem_cnt; j++) { > + size_t iov_still_needed =3D iov_cnt - k; > + > + if (elem[j].in_num > iov_still_needed) > + elem[j].in_num =3D iov_still_needed; > + k +=3D elem[j].in_num; > + elem_used++; > + } > =20 > /* release unused buffers */ > vu_queue_rewind(vq, elem_cnt - elem_used); > --=20 > 2.53.0 >=20 --=20 David Gibson (he or they) | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you, not the other way | around. http://www.ozlabs.org/~dgibson --TrEm/m21r/PDhr7s Content-Type: application/pgp-signature; name=signature.asc -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEO+dNsU4E3yXUXRK2zQJF27ox2GcFAmncSZMACgkQzQJF27ox 2GdmIRAAl+yjQLRmnnK6at9yeIa5zhBpaf6Bais3cnJKMW7DZSqQDiy5yS0b6aBz tIY4MeU2574/4TKvzxR9/OHEgIs3ypPLOPeBX4yMVrMw1Fp7RoGQRmJvLj64sRI5 WtnpqDR40VYtzc5iBXolpvY++qvlqdZc9QvmosBqmSigVkKoz4NbbTJYHMRR5rZC UhsQ7+Rl1Ur0OPGjwZnOULOwsOXJs1I+evGaMrMKlAqJCnOjOKZqgElgdpIGN//h 3RtgsG5bEkHNHywHjdbmo2TmrGKrYu2tcxrx57F8+SvQpK7eyND5uWKj0Vpkyh8V SceRjGmeMkU8pm2kcSDmQtVMLFk9fQsm/yXjPBLRi8j6YuE/Efjw1v076sFNNTO4 aSc6LDepAXMHgFEf31pLCzXcXl2JbkM+G2TNDngyN+1PSei0P/LYzRm55aLCsUgv XBOerd5W8bAygz7sMXelfGM2fr1I4j9Pa+x8kz8mUdZRGhCcGfYsa9GbcL3zZYLC gHHVVhO2N6m92+g/b7jlXsegmoZgyk3+hdNwgSvr3PnSpJVIfY4jkx/pTYAs9xbQ aT0h0dF++xmyUszcBS3Y/zy0tXsQHK/2H5kWgtToCpVeW/QNi99m8Qy7QutfRGJe vrIN1GkjmpibqtxRijrXUBQ98Mkq3JRNcMBia1wXg+rwNSNfNQw= =euMq -----END PGP SIGNATURE----- --TrEm/m21r/PDhr7s--