mem: rename address mapping function to IOVA
[dpdk.git] / lib / librte_vhost / vhost_user.c
index 1dfb234..97a5c3f 100644 (file)
@@ -372,33 +372,6 @@ ring_addr_to_vva(struct virtio_net *dev, struct vhost_virtqueue *vq,
        return qva_to_vva(dev, ra);
 }
 
-/*
- * The virtio device sends us the desc, used and avail ring addresses.
- * This function then converts these to our address space.
- */
-static int
-vhost_user_set_vring_addr(struct virtio_net *dev, VhostUserMsg *msg)
-{
-       struct vhost_virtqueue *vq;
-       struct vhost_vring_addr *addr = &msg->payload.addr;
-
-       if (dev->mem == NULL)
-               return -1;
-
-       /* addr->index refers to the queue index. The txq 1, rxq is 0. */
-       vq = dev->virtqueue[msg->payload.addr.index];
-
-       /*
-        * Rings addresses should not be interpreted as long as the ring is not
-        * started and enabled
-        */
-       memcpy(&vq->ring_addrs, addr, sizeof(*addr));
-
-       vring_invalidate(dev, vq);
-
-       return 0;
-}
-
 static struct virtio_net *
 translate_ring_addresses(struct virtio_net *dev, int vq_index)
 {
@@ -420,6 +393,7 @@ translate_ring_addresses(struct virtio_net *dev, int vq_index)
 
        dev = numa_realloc(dev, vq_index);
        vq = dev->virtqueue[vq_index];
+       addr = &vq->ring_addrs;
 
        vq->avail = (struct vring_avail *)(uintptr_t)ring_addr_to_vva(dev,
                        vq, addr->avail_user_addr, sizeof(struct vring_avail));
@@ -462,6 +436,43 @@ translate_ring_addresses(struct virtio_net *dev, int vq_index)
        return dev;
 }
 
+/*
+ * The virtio device sends us the desc, used and avail ring addresses.
+ * This function then converts these to our address space.
+ */
+static int
+vhost_user_set_vring_addr(struct virtio_net **pdev, VhostUserMsg *msg)
+{
+       struct vhost_virtqueue *vq;
+       struct vhost_vring_addr *addr = &msg->payload.addr;
+       struct virtio_net *dev = *pdev;
+
+       if (dev->mem == NULL)
+               return -1;
+
+       /* addr->index refers to the queue index. The txq 1, rxq is 0. */
+       vq = dev->virtqueue[msg->payload.addr.index];
+
+       /*
+        * Rings addresses should not be interpreted as long as the ring is not
+        * started and enabled
+        */
+       memcpy(&vq->ring_addrs, addr, sizeof(*addr));
+
+       vring_invalidate(dev, vq);
+
+       if (vq->enabled && (dev->features &
+                               (1ULL << VHOST_USER_F_PROTOCOL_FEATURES))) {
+               dev = translate_ring_addresses(dev, msg->payload.state.index);
+               if (!dev)
+                       return -1;
+
+               *pdev = dev;
+       }
+
+       return 0;
+}
+
 /*
  * The virtio device sends us the available ring last used index.
  */
@@ -515,7 +526,7 @@ add_guest_pages(struct virtio_net *dev, struct rte_vhost_mem_region *reg,
        uint64_t host_phys_addr;
        uint64_t size;
 
-       host_phys_addr = rte_mem_virt2phy((void *)(uintptr_t)host_user_addr);
+       host_phys_addr = rte_mem_virt2iova((void *)(uintptr_t)host_user_addr);
        size = page_size - (guest_phys_addr & (page_size - 1));
        size = RTE_MIN(size, reg_size);
 
@@ -526,7 +537,7 @@ add_guest_pages(struct virtio_net *dev, struct rte_vhost_mem_region *reg,
 
        while (reg_size > 0) {
                size = RTE_MIN(reg_size, page_size);
-               host_phys_addr = rte_mem_virt2phy((void *)(uintptr_t)
+               host_phys_addr = rte_mem_virt2iova((void *)(uintptr_t)
                                                  host_user_addr);
                add_one_guest_page(dev, guest_phys_addr, host_phys_addr, size);
 
@@ -1272,7 +1283,7 @@ vhost_user_msg_handler(int vid, int fd)
                vhost_user_set_vring_num(dev, &msg);
                break;
        case VHOST_USER_SET_VRING_ADDR:
-               vhost_user_set_vring_addr(dev, &msg);
+               vhost_user_set_vring_addr(&dev, &msg);
                break;
        case VHOST_USER_SET_VRING_BASE:
                vhost_user_set_vring_base(dev, &msg);