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=D7tWNNAq; dkim-atps=neutral Received: from mail.ozlabs.org (gandalf.ozlabs.org [150.107.74.76]) by passt.top (Postfix) with ESMTPS id 7B5A15A0274 for ; Mon, 02 Mar 2026 01:52:04 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=202602; t=1772412721; bh=YVB22X9nVCIadlxnbvVMLw+xv1RbL4fTXT2qj42fzQg=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=D7tWNNAqFz3lcEK6UTFpwpqu/R5FTrU0O+Ark9xiX7zd5saszqN20JCqj5UFO028+ ADo5QVVuhMnJpWhf821ERzuMfgo0kxTEunUw/DomWBONe5CDsxXC4sg8ATQG0Y1Isc kwT1b/NcqdenLLTzREnT5fIE7HEOYz0FFWXhpJZkWr+riWVjFiJCqbPkMak6hYNJJV SyveNyVL3KI4coICvnBvSQD4aGD3ZBFgTtyTYozYXKIBa4DLwjGzEFo6Rdd5Fd+JJ7 Q4vThU07lBjF3Y5TUKR4FLsrL3AlRVjbg5GsWB9YsrwBtE1BAKpcaqzubu/3aMxAWo eaQmDj1f1fFxQ== Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4fPL412G02z4w8x; Mon, 02 Mar 2026 11:52:01 +1100 (AEDT) Date: Mon, 2 Mar 2026 11:51:54 +1100 From: David Gibson To: Laurent Vivier Subject: Re: [PATCH 08/12] vu_common: Pass iov_tail to vu_set_vnethdr() Message-ID: References: <20260227140330.2216753-1-lvivier@redhat.com> <20260227140330.2216753-9-lvivier@redhat.com> MIME-Version: 1.0 In-Reply-To: <20260227140330.2216753-9-lvivier@redhat.com> 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 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="3DzxaLyGT2Hzq+Ew" Content-Disposition: inline Message-ID-Hash: ZAVKDVQWJNMNTLEOWOZRJPLP3THLTJLJ X-Message-ID-Hash: ZAVKDVQWJNMNTLEOWOZRJPLP3THLTJLJ 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: --3DzxaLyGT2Hzq+Ew Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Fri, Feb 27, 2026 at 03:03:26PM +0100, Laurent Vivier wrote: > Refactor vu_set_vnethdr() to take an iov_tail pointer instead of a > direct pointer to the virtio_net_hdr_mrg_rxbuf structure. > This makes the function use IOV_PEEK_HEADER() and IOV_PUT_HEADER() > to read and write the virtio-net header through the iov_tail abstraction. >=20 > Signed-off-by: Laurent Vivier LGTM, with one nit. > --- > tcp_vu.c | 8 +++++--- > udp_vu.c | 3 +-- > vu_common.c | 24 ++++++++++++++++-------- > vu_common.h | 3 +-- > 4 files changed, 23 insertions(+), 15 deletions(-) >=20 > diff --git a/tcp_vu.c b/tcp_vu.c > index 98e5974fee0e..92667507ac9b 100644 > --- a/tcp_vu.c > +++ b/tcp_vu.c > @@ -94,10 +94,11 @@ int tcp_vu_send_flag(const struct ctx *c, struct tcp_= tap_conn *conn, int flags) > =09if (elem_cnt !=3D 1) > =09=09return -1; > =20 > -=09ASSERT(flags_elem[0].in_sg[0].iov_len >=3D > +=09payload =3D IOV_TAIL(&flags_elem[0].in_sg[0], elem_cnt, 0); Shouldn't a later initialization of payload be removed to match this? > +=09ASSERT(iov_tail_size(&payload) >=3D > =09 MAX(hdrlen + sizeof(*opts), ETH_ZLEN + VNET_HLEN)); > =20 > -=09vu_set_vnethdr(vdev, flags_elem[0].in_sg[0].iov_base, 1); > +=09vu_set_vnethdr(vdev, &payload, 1); > =20 > =09eh =3D vu_eth(flags_elem[0].in_sg[0].iov_base); > =20 > @@ -448,11 +449,12 @@ int tcp_vu_data_from_sock(const struct ctx *c, stru= ct tcp_tap_conn *conn) > =09for (i =3D 0, previous_dlen =3D -1, check =3D NULL; i < head_cnt; i++= ) { > =09=09struct iovec *iov =3D &elem[head[i]].in_sg[0]; > =09=09int buf_cnt =3D head[i + 1] - head[i]; > +=09=09struct iov_tail data =3D IOV_TAIL(iov, buf_cnt, 0); > =09=09ssize_t dlen =3D iov_size(iov, buf_cnt) - hdrlen; > =09=09bool push =3D i =3D=3D head_cnt - 1; > =09=09size_t l2len; > =20 > -=09=09vu_set_vnethdr(vdev, iov->iov_base, buf_cnt); > +=09=09vu_set_vnethdr(vdev, &data, buf_cnt); > =20 > =09=09/* The IPv4 header checksum varies only with dlen */ > =09=09if (previous_dlen !=3D dlen) > diff --git a/udp_vu.c b/udp_vu.c > index 6d87f4872268..5ae79b9bb0c5 100644 > --- a/udp_vu.c > +++ b/udp_vu.c > @@ -234,8 +234,7 @@ void udp_vu_sock_to_tap(const struct ctx *c, int s, i= nt n, flow_sidx_t tosidx) > =09=09vu_queue_rewind(vq, elem_cnt - elem_used); > =20 > =09=09if (data.cnt > 0) { > -=09=09=09vu_set_vnethdr(vdev, data.iov[0].iov_base, elem_used); > -=09=09=09iov_drop_header(&data, VNET_HLEN); > +=09=09=09vu_set_vnethdr(vdev, &data, elem_used); > =09=09=09udp_vu_prepare(c, &data, toside); > =09=09=09if (*c->pcap) { > =09=09=09=09udp_vu_csum(toside, &data); > diff --git a/vu_common.c b/vu_common.c > index 7a8cd18f4e81..a8d5fcdaea83 100644 > --- a/vu_common.c > +++ b/vu_common.c > @@ -120,18 +120,25 @@ int vu_collect(const struct vu_dev *vdev, struct vu= _virtq *vq, > } > =20 > /** > - * vu_set_vnethdr() - set virtio-net headers > + * vu_set_vnethdr() - set virtio-net header > * @vdev:=09=09vhost-user device > - * @vnethdr:=09=09Address of the header to set > + * @data:=09=09IOV tail to write header to, updated to > + * =09=09=09point after the virtio-net header > * @num_buffers:=09Number of guest buffers of the frame > */ > -void vu_set_vnethdr(const struct vu_dev *vdev, > -=09=09 struct virtio_net_hdr_mrg_rxbuf *vnethdr, > +void vu_set_vnethdr(const struct vu_dev *vdev, struct iov_tail *data, > =09=09 int num_buffers) > { > +=09struct virtio_net_hdr_mrg_rxbuf vnethdr_storage, *vnethdr; > + > +=09vnethdr =3D IOV_PEEK_HEADER(data, vnethdr_storage); > + > =09vnethdr->hdr =3D VU_HEADER; > + > =09if (vu_has_feature(vdev, VIRTIO_NET_F_MRG_RXBUF)) > =09=09vnethdr->num_buffers =3D htole16(num_buffers); > + > +=09IOV_PUT_HEADER(data, vnethdr); > } > =20 > /** > @@ -248,6 +255,7 @@ int vu_send_single(const struct ctx *c, const void *b= uf, size_t size) > =09struct vu_virtq *vq =3D &vdev->vq[VHOST_USER_RX_QUEUE]; > =09struct vu_virtq_element elem[VIRTQUEUE_MAX_SIZE]; > =09struct iovec in_sg[VIRTQUEUE_MAX_SIZE]; > +=09struct iov_tail data; > =09size_t total; > =09int elem_cnt; > =09int i; > @@ -269,15 +277,15 @@ int vu_send_single(const struct ctx *c, const void = *buf, size_t size) > =09=09goto err; > =09} > =20 > -=09vu_set_vnethdr(vdev, in_sg[0].iov_base, elem_cnt); > - > +=09data =3D IOV_TAIL(&in_sg[0], elem_cnt, 0); > +=09vu_set_vnethdr(vdev, &data, elem_cnt); > =09total -=3D VNET_HLEN; > =20 > =09/* copy data from the buffer to the iovec */ > -=09iov_from_buf(in_sg, elem_cnt, VNET_HLEN, buf, total); > +=09iov_from_buf(data.iov, data.cnt, data.off, buf, total); > =20 > =09if (*c->pcap) > -=09=09pcap_iov(in_sg, elem_cnt, VNET_HLEN); > +=09=09pcap_iov(data.iov, data.cnt, data.off); > =20 > =09vu_flush(vdev, vq, elem, elem_cnt); > =20 > diff --git a/vu_common.h b/vu_common.h > index 052aff710502..41cf18936300 100644 > --- a/vu_common.h > +++ b/vu_common.h > @@ -49,8 +49,7 @@ void vu_init_elem(struct vu_virtq_element *elem, struct= iovec *iov, > int vu_collect(const struct vu_dev *vdev, struct vu_virtq *vq, > =09 struct vu_virtq_element *elem, int max_elem, size_t size, > =09 size_t *collected); > -void vu_set_vnethdr(const struct vu_dev *vdev, > -=09=09 struct virtio_net_hdr_mrg_rxbuf *vnethdr, > +void vu_set_vnethdr(const struct vu_dev *vdev, struct iov_tail *data, > =09=09 int num_buffers); > void vu_flush(const struct vu_dev *vdev, struct vu_virtq *vq, > =09 struct vu_virtq_element *elem, int elem_cnt); > --=20 > 2.53.0 >=20 --=20 David Gibson (he or they)=09| I'll have my music baroque, and my code david AT gibson.dropbear.id.au=09| minimalist, thank you, not the other way =09=09=09=09| around. http://www.ozlabs.org/~dgibson --3DzxaLyGT2Hzq+Ew Content-Type: application/pgp-signature; name=signature.asc -----BEGIN PGP SIGNATURE----- iQIyBAEBCgAdFiEEO+dNsU4E3yXUXRK2zQJF27ox2GcFAmmk3ykACgkQzQJF27ox 2GcsQQ/3XZXhS+4BIjs0yarMk2U9h55jEQ3Q7mmQ+0ShmbloDBGcAkL3rMrKx2mQ aHqwRN/afLXrsy+Yl5MOdYQcf8nfizXkZrECTqbEu2qTKWVXdbyDx0F+iKNmki1x SfwoBsVX844Pi3zvT2uMiLY0CFmSL0l+2Wnud17e2C/Mg1YQtpxmuiPzrx5wCNHI xXzTbmc0UbNzW/OF/oRllzE8BeJ1AgHf9MAHiN4SjI5HRpkezm70rCtRALC1VXkA 1QRKxnIVOkgeAskLbys+HumsdG5AimuYLNQ2hCkQTgrLQkg+6czztkZZjSIFlnA9 RBT1sIu9z8888ARNORKhOs8d1Tn10aqkGJBgWWojmFsLl4wECXgcCyx5Ce7n2nrQ rs29+fSLHgVhdWiEJESE/EPxAQcI3dwhzkBiX20P/COjFk4YF4F1nwThAkw3WLvi 7FEIf/RWQ3QinkcTVg3s6FkB3krUm7NMd2rjazDzIhSqhzp+k9fS6BLjvPw26chF r73JJcsLw/uyFuNwaS1podN9bnqIlhJrnN56ufhm7+PBjIZcQfC95PxKTkmucsNV iMKo5hE3kvIz1fnhrgKrmRFRak6QQVdP8BtoZfAozr4layOj6dPrtUZZqieAO2wq 2SC7js0h5tcScMsoIdSArefBZ3X0kzuU9Njnc+86Fo1v7Nw+2g== =6nvz -----END PGP SIGNATURE----- --3DzxaLyGT2Hzq+Ew--