DPDK patches and discussions
 help / color / mirror / Atom feed
* [PATCH v2] net/virtio-user: fix used ring address calculation
@ 2025-10-07 14:47 Maxime Coquelin
  0 siblings, 0 replies; only message in thread
From: Maxime Coquelin @ 2025-10-07 14:47 UTC (permalink / raw)
  To: dev, amorenoz, david.marchand, chenbox; +Cc: Maxime Coquelin, stable

This patch fixes the used ring address calculation, to
avoid Vhost-vDPA backends (such as VDUSE) to fail while
trying to translate it.

Fixes: 666ef294ddf7 ("net/virtio-user: share descriptor IOVA to backend")
Cc: stable@dpdk.org

Reported-by: Adrian Moreno <amorenoz@redhat.com>
Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
---

Changes in v2:
- Refactor addresses calculation (David)

---


 .../net/virtio/virtio_user/virtio_user_dev.c  | 30 ++++++++-----------
 1 file changed, 13 insertions(+), 17 deletions(-)

diff --git a/drivers/net/virtio/virtio_user/virtio_user_dev.c b/drivers/net/virtio/virtio_user/virtio_user_dev.c
index 187f81b066..f3df73c1f0 100644
--- a/drivers/net/virtio/virtio_user/virtio_user_dev.c
+++ b/drivers/net/virtio/virtio_user/virtio_user_dev.c
@@ -118,7 +118,7 @@ virtio_user_kick_queue(struct virtio_user_dev *dev, uint32_t queue_sel)
 	struct vhost_vring_state state;
 	struct vring *vring = &dev->vrings.split[queue_sel];
 	struct vring_packed *pq_vring = &dev->vrings.packed[queue_sel];
-	uint64_t desc_addr, avail_addr, used_addr;
+	uint64_t desc_addr, desc_iova_addr, avail_addr, used_addr;
 	struct vhost_vring_addr addr = {
 		.index = queue_sel,
 		.log_guest_addr = 0,
@@ -138,25 +138,21 @@ virtio_user_kick_queue(struct virtio_user_dev *dev, uint32_t queue_sel)
 	}

 	if (dev->features & (1ULL << VIRTIO_F_RING_PACKED)) {
-		desc_addr = pq_vring->desc_iova;
-		avail_addr = desc_addr + pq_vring->num * sizeof(struct vring_packed_desc);
-		used_addr =  RTE_ALIGN_CEIL(avail_addr + sizeof(struct vring_packed_desc_event),
-					    VIRTIO_VRING_ALIGN);
-
-		addr.desc_user_addr = desc_addr;
-		addr.avail_user_addr = avail_addr;
-		addr.used_user_addr = used_addr;
+		desc_iova_addr = pq_vring->desc_iova;
+		desc_addr = (uint64_t)(uintptr_t)pq_vring->desc;
+		avail_addr = (uint64_t)(uintptr_t)pq_vring->driver;
+		used_addr = (uint64_t)(uintptr_t)pq_vring->device;
 	} else {
-		desc_addr = vring->desc_iova;
-		avail_addr = desc_addr + vring->num * sizeof(struct vring_desc);
-		used_addr = RTE_ALIGN_CEIL((uintptr_t)(&vring->avail->ring[vring->num]),
-					   VIRTIO_VRING_ALIGN);
-
-		addr.desc_user_addr = desc_addr;
-		addr.avail_user_addr = avail_addr;
-		addr.used_user_addr = used_addr;
+		desc_iova_addr = vring->desc_iova;
+		desc_addr = (uint64_t)(uintptr_t)vring->desc;
+		avail_addr = (uint64_t)(uintptr_t)vring->avail;
+		used_addr = (uint64_t)(uintptr_t)vring->used;
 	}

+	addr.desc_user_addr = desc_iova_addr;
+	addr.avail_user_addr = (desc_iova_addr - desc_addr) + avail_addr;
+	addr.used_user_addr = (desc_iova_addr - desc_addr) + used_addr;
+
 	state.index = queue_sel;
 	state.num = vring->num;
 	ret = dev->ops->set_vring_num(dev, &state);
--
2.51.0


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2025-10-07 14:48 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-10-07 14:47 [PATCH v2] net/virtio-user: fix used ring address calculation Maxime Coquelin

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 NNTP newsgroup(s).