In preparation to support VIRTIO_F_DMB, create the modern PCI
transport's virtqueues with the mapping token held on the
virtio_device. Every mapping call for a virtqueue is handed a union
virtio_map token, and vring_create_virtqueue() derives that token as
{.dma_dev = vdev->dev.parent} without letting its callers choose.

Set vdev->vmap.dma_dev in virtio_pci_modern_probe() and create the
virtqueues through vring_create_virtqueue_map() instead. That covers
both the virtqueues from vp_modern_find_vqs() and the admin virtqueue,
which go through the same setup_vq(). virtio_pci_probe() assigns
vdev->dev.parent first, so the token holds the pointer
vring_create_virtqueue() would have derived.

The legacy transport keeps its own vring_create_virtqueue() call:
vp_legacy_get_features() reads 32 feature bits, so VIRTIO_F_DMB cannot
reach it.

Assisted-by: Kiro:claude-opus-5 checkpatch sparse
Signed-off-by: Alexander Graf <[email protected]>
---
 drivers/virtio/virtio_pci_modern.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/drivers/virtio/virtio_pci_modern.c 
b/drivers/virtio/virtio_pci_modern.c
index 6d8ae2a6a8ca..565d37b630b3 100644
--- a/drivers/virtio/virtio_pci_modern.c
+++ b/drivers/virtio/virtio_pci_modern.c
@@ -715,10 +715,11 @@ static struct virtqueue *setup_vq(struct 
virtio_pci_device *vp_dev,
        info->msix_vector = msix_vec;
 
        /* create the vring */
-       vq = vring_create_virtqueue(index, num,
-                                   SMP_CACHE_BYTES, &vp_dev->vdev,
-                                   true, true, ctx,
-                                   notify, callback, name);
+       vq = vring_create_virtqueue_map(index, num,
+                                       SMP_CACHE_BYTES, &vp_dev->vdev,
+                                       true, true, ctx,
+                                       notify, callback, name,
+                                       vp_dev->vdev.vmap);
        if (!vq)
                return ERR_PTR(-ENOMEM);
 
@@ -1289,6 +1290,14 @@ int virtio_pci_modern_probe(struct virtio_pci_device 
*vp_dev)
        vp_dev->isr = mdev->isr;
        vp_dev->vdev.id = mdev->id;
 
+       /*
+        * The mapping token every virtqueue of this device is created with.
+        * This is the same value vring_create_virtqueue() would derive from
+        * vdev->dev.parent, kept here so that a transport feature can replace
+        * it in one place.
+        */
+       vp_dev->vdev.vmap.dma_dev = &pci_dev->dev;
+
        spin_lock_init(&vp_dev->admin_vq.lock);
        return 0;
 }

Reply via email to