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=Z88gIj0F; dkim-atps=neutral Received: from mail.ozlabs.org (mail.ozlabs.org [IPv6:2404:9400:2221:ea00::3]) by passt.top (Postfix) with ESMTPS id 242795A0262 for ; Mon, 16 Mar 2026 10:08:23 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gibson.dropbear.id.au; s=202602; t=1773652098; bh=aLqrZxCULfjYbRquoZv8O6LUHGf+q8hkeESqhtu6RCM=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=Z88gIj0F7p+1PMTZpuefQVvfFSDy5GXC64z4Maf3KhL5Mj/vWMcceml02vBcpKDyP Bl/XteHO4F1oQRxQvK1qPxiP8ZTzEyiuJ3NLqByD+wUvd3LiTzSe2u4jEbzupo0Abg Q3SGZTd5+azU4ejarfqW+Q84m7bVSChEK5wMq9lTrDlMEHOvkldFfx6AdXtbmVi2Xr Qk+rKtO2OyesGkXdgXVyhXe4wxaT+6XoWUH3QYin4hMBGAt4hsLXyuQDWDzc2f7KKa pjQFjB1kfcDZoXUBEpNuDmzxczftc9dUcraz9nqAIBo8l9z/S/h0B+8UlYi3xaRiw6 VZT/HNpNRe4QQ== Received: by gandalf.ozlabs.org (Postfix, from userid 1007) id 4fZ8QB4BMKz4wD3; Mon, 16 Mar 2026 20:08:18 +1100 (AEDT) Date: Mon, 16 Mar 2026 19:25:54 +1100 From: David Gibson To: Laurent Vivier Subject: Re: [PATCH v2 1/3] virtio: Pass iovec arrays as separate parameters to vu_queue_pop() Message-ID: References: <20260313182618.4157365-1-lvivier@redhat.com> <20260313182618.4157365-2-lvivier@redhat.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="rHznm5IV3QHhjlJE" Content-Disposition: inline In-Reply-To: <20260313182618.4157365-2-lvivier@redhat.com> Message-ID-Hash: S7VQTRHOO2PNA3POURECC2MYKNO2TEZD X-Message-ID-Hash: S7VQTRHOO2PNA3POURECC2MYKNO2TEZD 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: --rHznm5IV3QHhjlJE Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Fri, Mar 13, 2026 at 07:26:16PM +0100, Laurent Vivier wrote: > Currently vu_queue_pop() and vu_queue_map_desc() read the iovec arrays > (in_sg/out_sg) and their sizes (in_num/out_num) from the vu_virtq_element > struct. This couples the iovec storage to the element, requiring callers > like vu_handle_tx() to pre-initialize the element fields before calling > vu_queue_pop(). >=20 > Pass the iovec arrays and their maximum sizes as separate parameters > instead. vu_queue_map_desc() now writes the actual descriptor count > and iovec pointers back into the element after mapping, rather than > using the element as both input and output. >=20 > This decouples the iovec storage from the element, which is a > prerequisite for multi-buffer support where a single frame can span > multiple virtqueue elements sharing a common iovec pool. >=20 > No functional change. >=20 > Signed-off-by: Laurent Vivier Reviewed-by: David Gibson > --- > virtio.c | 29 ++++++++++++++++++++++------- > virtio.h | 4 +++- > vu_common.c | 14 +++++++------- > 3 files changed, 32 insertions(+), 15 deletions(-) >=20 > diff --git a/virtio.c b/virtio.c > index 447137ee83dd..a671163c27a0 100644 > --- a/virtio.c > +++ b/virtio.c > @@ -428,12 +428,18 @@ static bool virtqueue_map_desc(const struct vu_dev = *dev, > * @vq: Virtqueue > * @idx: First descriptor ring entry to map > * @elem: Virtqueue element to store descriptor ring iov > + * @in_sg: Incoming iovec array for device-writable descriptors > + * @max_in_sg: Maximum number of entries in @in_sg > + * @out_sg: Outgoing iovec array for device-readable descriptors > + * @max_out_sg: Maximum number of entries in @out_sg > * > * Return: -1 if there is an error, 0 otherwise > */ > static int vu_queue_map_desc(const struct vu_dev *dev, > struct vu_virtq *vq, unsigned int idx, > - struct vu_virtq_element *elem) > + struct vu_virtq_element *elem, > + struct iovec *in_sg, size_t max_in_sg, > + struct iovec *out_sg, size_t max_out_sg) > { > const struct vring_desc *desc =3D vq->vring.desc; > struct vring_desc desc_buf[VIRTQUEUE_MAX_SIZE]; > @@ -470,16 +476,16 @@ static int vu_queue_map_desc(const struct vu_dev *d= ev, > /* Collect all the descriptors */ > do { > if (le16toh(desc[i].flags) & VRING_DESC_F_WRITE) { > - if (!virtqueue_map_desc(dev, &in_num, elem->in_sg, > - elem->in_num, > + if (!virtqueue_map_desc(dev, &in_num, in_sg, > + max_in_sg, > le64toh(desc[i].addr), > le32toh(desc[i].len))) > return -1; > } else { > if (in_num) > die("Incorrect order for descriptors"); > - if (!virtqueue_map_desc(dev, &out_num, elem->out_sg, > - elem->out_num, > + if (!virtqueue_map_desc(dev, &out_num, out_sg, > + max_out_sg, > le64toh(desc[i].addr), > le32toh(desc[i].len))) { > return -1; > @@ -496,7 +502,9 @@ static int vu_queue_map_desc(const struct vu_dev *dev, > die("vhost-user: Failed to read descriptor list"); > =20 > elem->index =3D idx; > + elem->in_sg =3D in_sg; > elem->in_num =3D in_num; > + elem->out_sg =3D out_sg; > elem->out_num =3D out_num; > =20 > return 0; > @@ -507,11 +515,17 @@ static int vu_queue_map_desc(const struct vu_dev *d= ev, > * @dev: Vhost-user device > * @vq: Virtqueue > * @elem: Virtqueue element to fill with the entry information > + * @in_sg: Incoming iovec array for device-writable descriptors > + * @max_in_sg: Maximum number of entries in @in_sg > + * @out_sg: Outgoing iovec array for device-readable descriptors > + * @max_out_sg: Maximum number of entries in @out_sg > * > * Return: -1 if there is an error, 0 otherwise > */ > int vu_queue_pop(const struct vu_dev *dev, struct vu_virtq *vq, > - struct vu_virtq_element *elem) > + struct vu_virtq_element *elem, > + struct iovec *in_sg, size_t max_in_sg, > + struct iovec *out_sg, size_t max_out_sg) > { > unsigned int head; > int ret; > @@ -535,7 +549,8 @@ int vu_queue_pop(const struct vu_dev *dev, struct vu_= virtq *vq, > if (vu_has_feature(dev, VIRTIO_RING_F_EVENT_IDX)) > vring_set_avail_event(vq, vq->last_avail_idx); > =20 > - ret =3D vu_queue_map_desc(dev, vq, head, elem); > + ret =3D vu_queue_map_desc(dev, vq, head, elem, in_sg, max_in_sg, > + out_sg, max_out_sg); > =20 > if (ret < 0) > return ret; > diff --git a/virtio.h b/virtio.h > index d04bbe84e5c4..c7e447d59860 100644 > --- a/virtio.h > +++ b/virtio.h > @@ -188,7 +188,9 @@ static inline bool vu_has_protocol_feature(const stru= ct vu_dev *vdev, > =20 > void vu_queue_notify(const struct vu_dev *dev, struct vu_virtq *vq); > int vu_queue_pop(const struct vu_dev *dev, struct vu_virtq *vq, > - struct vu_virtq_element *elem); > + struct vu_virtq_element *elem, > + struct iovec *in_sg, size_t max_in_sg, > + struct iovec *out_sg, size_t max_out_sg); > void vu_queue_detach_element(struct vu_virtq *vq); > void vu_queue_unpop(struct vu_virtq *vq); > bool vu_queue_rewind(struct vu_virtq *vq, unsigned int num); > diff --git a/vu_common.c b/vu_common.c > index 5f2ce18e5b71..4d809ac38a4b 100644 > --- a/vu_common.c > +++ b/vu_common.c > @@ -91,7 +91,11 @@ int vu_collect(const struct vu_dev *vdev, struct vu_vi= rtq *vq, > struct iovec *iov; > int ret; > =20 > - ret =3D vu_queue_pop(vdev, vq, &elem[elem_cnt]); > + ret =3D vu_queue_pop(vdev, vq, &elem[elem_cnt], > + elem[elem_cnt].in_sg, > + elem[elem_cnt].in_num, > + elem[elem_cnt].out_sg, > + elem[elem_cnt].out_num); > if (ret < 0) > break; > =20 > @@ -178,12 +182,8 @@ static void vu_handle_tx(struct vu_dev *vdev, int in= dex, > int ret; > struct iov_tail data; > =20 > - elem[count].out_num =3D VU_MAX_TX_BUFFER_NB; > - elem[count].out_sg =3D &out_sg[out_sg_count]; > - elem[count].in_num =3D 0; > - elem[count].in_sg =3D NULL; > - > - ret =3D vu_queue_pop(vdev, vq, &elem[count]); > + ret =3D vu_queue_pop(vdev, vq, &elem[count], NULL, 0, > + &out_sg[out_sg_count], VU_MAX_TX_BUFFER_NB); > if (ret < 0) > break; > out_sg_count +=3D elem[count].out_num; > --=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 --rHznm5IV3QHhjlJE Content-Type: application/pgp-signature; name=signature.asc -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEO+dNsU4E3yXUXRK2zQJF27ox2GcFAmm3voIACgkQzQJF27ox 2Gd4rQ//fWvx88O23Mh8ZcvCwqK06BmjbuT5VnqbfwaI0d4lwzPZ3uZWkN0Uatrs VImm7ym51F03OtjliY3n90fGQ69hr5vqdZQGs+AjiwGCf+TU5nXyN4ZSTt3gnmxo ztm4HI3cuigHy8JT4C/7gGBhGchvMEwOSrWGBxzDnE3uCXokGV0U48d6ZNkGILvX z0JVZhUZXKJYNs+dnnA1PvYCJk5gU59DlfOvfOgNhMmEJV1SqMYEx7Cljo6o2g0H MzjHBWc7hdvpepAlE3at/HGt7xP9dyH87Z2QICd+yvFxkyomqy2aUHmNL5WaOqrq xJNEqUlLudHSs9vuZtCwmK0nppbKNAvTfgy9ZyxLfSr2e3zd3uN6cnSF8d+Vf045 0hTVv/MNMlZWybSoxVGM2g1uTVj7O+lacWGQjYZOQxryVjx0hwE4HmoFmGYcxTRv mva6ywGyP7dJ1YgARnUVa4NA+8HA9UBg+d9Dt+LhUAD+gO/itPYFxTaBn4S+3Z6W 5fI8e1i5Fv/XYHEkO3gXLdyTCuIV3qmAKiPJhwphrE0BswehUba8ps3NnjotPLhn CpMql8KtlXUxmV0lku8iSLQcX475HuoxkCVlzzyVAkQazfDF1glsuYW9OKHBZxDw 4bv4m+ochDLJaTp01i5hOeF3BIeR7Gcz5iIUJONEzplDuO4IOZc= =NI1O -----END PGP SIGNATURE----- --rHznm5IV3QHhjlJE--