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=c4VtH35Z; dkim-atps=neutral Received: from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3]) by passt.top (Postfix) with ESMTPS id BD4765A026D for ; Thu, 12 Mar 2026 05:39:47 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=202602; t=1773290383; bh=dSEHdw5GtTeMQDAP/H0bpVKxxjeyoFtWOA2SUbPsZQk=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=c4VtH35Z4IGQyhlSyzSgvjsWyb0azSTVXChr6OjfpMLOHWbGPhFy9VQZJMAe1Oxtc rz150m2N3XpaCXetlPABhXH1s42aQNbCbcMMJTYlh7LY7OLYiGB28Dja8mxL+wL1SM pfVy6XcsdSLGD/TJLjBTNVOZNee+xBjXiUkYPMRZ3qiMaRbigECvGdpiO+AV3gXUjo nHoeK0CG2b/1wB4cL8B2LoYQiwE0LRKz4btkQEev2B5k7Xdwusr2+1RtMrggJkIG80 2XiV4CD0hn9/8nLy0UESePFkPxIVQOxvZOXxyF4YneqeemR0QfniIPwWuCLfB4t/iy C5PNeDvJhALXw== Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4fWZf750QXz4wDJ; Thu, 12 Mar 2026 15:39:43 +1100 (AEDT) Date: Thu, 12 Mar 2026 15:34:25 +1100 From: David Gibson To: Laurent Vivier Subject: Re: [PATCH v2 09/13] vu_common: Pass iov_tail to vu_set_vnethdr() Message-ID: References: <20260309094744.1907754-1-lvivier@redhat.com> <20260309094744.1907754-10-lvivier@redhat.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="5TFenodduGM2qqrF" Content-Disposition: inline In-Reply-To: <20260309094744.1907754-10-lvivier@redhat.com> Message-ID-Hash: SW333QS3HQBQ7YVJSD7JV3MTCMG6FQ75 X-Message-ID-Hash: SW333QS3HQBQ7YVJSD7JV3MTCMG6FQ75 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: --5TFenodduGM2qqrF Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Mon, Mar 09, 2026 at 10:47:40AM +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 Reviewed-by: David Gibson > --- > tcp_vu.c | 8 +++++--- > udp_vu.c | 3 +-- > vu_common.c | 21 +++++++++++++++------ > vu_common.h | 2 +- > 4 files changed, 22 insertions(+), 12 deletions(-) >=20 > diff --git a/tcp_vu.c b/tcp_vu.c > index 8da2dcfe78d0..688f48905d46 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) > if (elem_cnt !=3D 1) > return -1; > =20 > - ASSERT(flags_elem[0].in_sg[0].iov_len >=3D > + payload =3D IOV_TAIL(&flags_elem[0].in_sg[0], elem_cnt, 0); > + ASSERT(iov_tail_size(&payload) >=3D > MAX(hdrlen + sizeof(*opts), ETH_ZLEN + VNET_HLEN)); > =20 > - vu_set_vnethdr(flags_elem[0].in_sg[0].iov_base, 1); > + vu_set_vnethdr(&payload, 1); > =20 > eh =3D vu_eth(flags_elem[0].in_sg[0].iov_base); > =20 > @@ -454,6 +455,7 @@ int tcp_vu_data_from_sock(const struct ctx *c, struct= tcp_tap_conn *conn) > for (i =3D 0, previous_dlen =3D -1, check =3D NULL; i < head_cnt; i++) { > struct iovec *iov =3D &elem[head[i]].in_sg[0]; > int buf_cnt =3D head[i + 1] - head[i]; > + struct iov_tail data =3D IOV_TAIL(iov, buf_cnt, 0); > size_t frame_size =3D iov_size(iov, buf_cnt); > bool push =3D i =3D=3D head_cnt - 1; > ssize_t dlen; > @@ -461,7 +463,7 @@ int tcp_vu_data_from_sock(const struct ctx *c, struct= tcp_tap_conn *conn) > ASSERT(frame_size >=3D hdrlen); > =20 > dlen =3D frame_size - hdrlen; > - vu_set_vnethdr(iov->iov_base, buf_cnt); > + vu_set_vnethdr(&data, buf_cnt); > =20 > /* The IPv4 header checksum varies only with dlen */ > if (previous_dlen !=3D dlen) > diff --git a/udp_vu.c b/udp_vu.c > index a21a03dbf23e..414750ff742a 100644 > --- a/udp_vu.c > +++ b/udp_vu.c > @@ -233,8 +233,7 @@ void udp_vu_sock_to_tap(const struct ctx *c, int s, i= nt n, flow_sidx_t tosidx) > vu_queue_rewind(vq, elem_cnt - elem_used); > if (iov_cnt > 0) { > struct iov_tail data =3D IOV_TAIL(iov_vu, iov_cnt, 0); > - vu_set_vnethdr(iov_vu[0].iov_base, elem_used); > - iov_drop_header(&data, VNET_HLEN); > + vu_set_vnethdr(&data, elem_used); > udp_vu_prepare(c, &data, toside); > if (*c->pcap) { > udp_vu_csum(toside, &data); > diff --git a/vu_common.c b/vu_common.c > index 8afa5199908f..3538e59581b7 100644 > --- a/vu_common.c > +++ b/vu_common.c > @@ -120,17 +120,24 @@ int vu_collect(const struct vu_dev *vdev, struct vu= _virtq *vq, > } > =20 > /** > - * vu_set_vnethdr() - set virtio-net headers > - * @vnethdr: Address of the header to set > + * vu_set_vnethdr() - set virtio-net header > + * @data: IOV tail to write header to, updated to > + * point after the virtio-net header > * @num_buffers: Number of guest buffers of the frame > */ > -void vu_set_vnethdr(struct virtio_net_hdr_mrg_rxbuf *vnethdr, int num_bu= ffers) > +void vu_set_vnethdr(struct iov_tail *data, int num_buffers) > { > + struct virtio_net_hdr_mrg_rxbuf vnethdr_storage, *vnethdr; > + > + vnethdr =3D IOV_PEEK_HEADER(data, vnethdr_storage); > + > vnethdr->hdr =3D VU_HEADER; > /* Note: if VIRTIO_NET_F_MRG_RXBUF is not negotiated, > * num_buffers must be 1 > */ > vnethdr->num_buffers =3D htole16(num_buffers); > + > + IOV_PUT_HEADER(data, vnethdr); > } > =20 > /** > @@ -267,6 +274,7 @@ int vu_send_single(const struct ctx *c, const void *b= uf, size_t size) > struct vu_virtq *vq =3D &vdev->vq[VHOST_USER_RX_QUEUE]; > struct vu_virtq_element elem[VIRTQUEUE_MAX_SIZE]; > struct iovec in_sg[VIRTQUEUE_MAX_SIZE]; > + struct iov_tail data; > size_t total; > int elem_cnt; > int i; > @@ -295,15 +303,16 @@ int vu_send_single(const struct ctx *c, const void = *buf, size_t size) > } > elem_cnt =3D iov_truncate(in_sg, elem_cnt, size); > =20 > - vu_set_vnethdr(in_sg[0].iov_base, elem_cnt); > + data =3D IOV_TAIL(&in_sg[0], elem_cnt, 0); > + vu_set_vnethdr(&data, elem_cnt); > =20 > size -=3D VNET_HLEN; > =20 > /* copy data from the buffer to the iovec */ > - iov_from_buf(in_sg, elem_cnt, VNET_HLEN, buf, size); > + iov_from_buf(in_sg, elem_cnt, data.off, buf, size); > =20 > if (*c->pcap) > - pcap_iov(in_sg, elem_cnt, VNET_HLEN); > + pcap_iov(data.iov, data.cnt, data.off); > =20 > vu_flush(vdev, vq, elem, elem_cnt); > =20 > diff --git a/vu_common.h b/vu_common.h > index 5de0c987b936..d068c61695f8 100644 > --- a/vu_common.h > +++ b/vu_common.h > @@ -55,7 +55,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, > struct vu_virtq_element *elem, int max_elem, size_t size, > size_t *collected); > -void vu_set_vnethdr(struct virtio_net_hdr_mrg_rxbuf *vnethdr, int num_bu= ffers); > +void vu_set_vnethdr(struct iov_tail *data, int num_buffers); > void vu_flush(const struct vu_dev *vdev, struct vu_virtq *vq, > struct vu_virtq_element *elem, int elem_cnt); > void vu_kick_cb(struct vu_dev *vdev, union epoll_ref ref, > --=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 --5TFenodduGM2qqrF Content-Type: application/pgp-signature; name=signature.asc -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEO+dNsU4E3yXUXRK2zQJF27ox2GcFAmmyQlAACgkQzQJF27ox 2Gc/GQ/+Lf3pg7y3EQJM+fAcYkUEHlE2ryAKl+HShB/HJHjQ8mFD7NjGaHu0NzAw MHIVZlCGuUu1EABOJfPpOMlRUs88jv2gwUaGDC+yESanhCUzxgT/r51lCqmo8Fwg 8J1R4/mHlflnJttUxFsUsZFzbAMjUwqHsZW7OhhSCFlkkrDtVuMlKwr935OzwYgN 4zICsLur7NY94GG35fdWKBjs98vnEQMHyNAiffcr5uSAEHs+tvq8KHSYpqboRRR6 ty2MqFjvWy0A3zW0ZaxqGTrxNT41AXbPnT2cLdx8+32pKt4+4ul8kZDyjyUj98Z1 tLsXhP9jkd/c2kOEAUoUjr9ffI6TOT1KD6CjXYMXBIg6YmNqJunEQEQ6rmEM+nMY MXttg+J4JiED4B8SjnL12uDoToSGWG/e94+LUeErbKe0j3pRL/CoCFT4G2tbCB22 NJhxQII+Wsxweia4JLMMcpFFeXuUQ/P+OxzG7RcpXt4NKY/jYlgJkAj4of23t79O XTXb07iGGc6A+I7WFBWgwlbQXFJW8jLuu9Jgqx7T6VgOMEQ/v+XPJLC893bC5Iwq 0/X6TDZVNZb0aR0+UvdWhSHoqUPTWD6cSYuHNkp+WPQ1OHbarwgau+vPKU+KyYNs nF78Jg2TYgUwjRidI4KSkq52MuuHf9fWCinf34m3VmdTdeNGRQM= =3cGG -----END PGP SIGNATURE----- --5TFenodduGM2qqrF--