[PATCH] vhost: fix vring addr update with vDPA

David Marchand david.marchand at redhat.com
Thu Mar 7 11:34:43 CET 2024


For vDPA devices, vq are not locked once the device has been configured
at runtime.

On the other hand, we need to hold the vq lock to evaluate vq->access_ok,
invalidate vring addresses and translate them.

Move vring address update earlier and, when vDPA is configured, skip parts
which expect lock to be taken.

Bugzilla ID: 1394
Fixes: 741dc052eaf9 ("vhost: annotate virtqueue access checks")

Signed-off-by: David Marchand <david.marchand at redhat.com>
---
No change, just resending for CI.

---
 lib/vhost/vhost_user.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/lib/vhost/vhost_user.c b/lib/vhost/vhost_user.c
index 3aba32c95a..7fe1687f08 100644
--- a/lib/vhost/vhost_user.c
+++ b/lib/vhost/vhost_user.c
@@ -986,17 +986,20 @@ vhost_user_set_vring_addr(struct virtio_net **pdev,
 	/* addr->index refers to the queue index. The txq 1, rxq is 0. */
 	vq = dev->virtqueue[ctx->msg.payload.addr.index];
 
-	/* vhost_user_lock_all_queue_pairs locked all qps */
-	VHOST_USER_ASSERT_LOCK(dev, vq, VHOST_USER_SET_VRING_ADDR);
-
-	access_ok = vq->access_ok;
-
 	/*
 	 * Rings addresses should not be interpreted as long as the ring is not
 	 * started and enabled
 	 */
 	memcpy(&vq->ring_addrs, addr, sizeof(*addr));
 
+	if (dev->flags & VIRTIO_DEV_VDPA_CONFIGURED)
+		goto out;
+
+	/* vhost_user_lock_all_queue_pairs locked all qps */
+	VHOST_USER_ASSERT_LOCK(dev, vq, VHOST_USER_SET_VRING_ADDR);
+
+	access_ok = vq->access_ok;
+
 	vring_invalidate(dev, vq);
 
 	if ((vq->enabled && (dev->features &
@@ -1006,6 +1009,7 @@ vhost_user_set_vring_addr(struct virtio_net **pdev,
 		*pdev = dev;
 	}
 
+out:
 	return RTE_VHOST_MSG_RESULT_OK;
 }
 
-- 
2.43.0



More information about the dev mailing list