From: Yuanhan Liu <yuanhan....@linux.intel.com>

Add code to set up packed queues when enabled.

Signed-off-by: Yuanhan Liu <yuanhan....@linux.intel.com>
Signed-off-by: Jens Freimann <jfrei...@redhat.com>
---
 lib/librte_vhost/vhost.h      |  1 +
 lib/librte_vhost/vhost_user.c | 21 ++++++++++++++++++++-
 2 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h
index 3004c26c1..20d78f883 100644
--- a/lib/librte_vhost/vhost.h
+++ b/lib/librte_vhost/vhost.h
@@ -74,6 +74,7 @@ struct batch_copy_elem {
  */
 struct vhost_virtqueue {
        struct vring_desc       *desc;
+       struct vring_desc_packed   *desc_packed;
        struct vring_avail      *avail;
        struct vring_used       *used;
        uint32_t                size;
diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c
index 157cf2f60..183893e46 100644
--- a/lib/librte_vhost/vhost_user.c
+++ b/lib/librte_vhost/vhost_user.c
@@ -469,6 +469,23 @@ translate_ring_addresses(struct virtio_net *dev, int 
vq_index)
        struct vhost_virtqueue *vq = dev->virtqueue[vq_index];
        struct vhost_vring_addr *addr = &vq->ring_addrs;
 
+       if (dev->features & (1ULL << VIRTIO_F_RING_PACKED)) {
+               vq->desc_packed = (struct vring_desc_packed *) ring_addr_to_vva
+                       (dev, vq, addr->desc_user_addr, 
sizeof(vq->desc_packed));
+               vq->desc = NULL;
+               vq->avail = NULL;
+               vq->used = NULL;
+               vq->log_guest_addr = 0;
+
+               if (vq->last_used_idx != 0) {
+                       RTE_LOG(WARNING, VHOST_CONFIG,
+                               "last_used_idx (%u) not 0\n",
+                               vq->last_used_idx);
+                       vq->last_used_idx = 0;
+               }
+               return dev;
+       }
+
        /* The addresses are converted from QEMU virtual to Vhost virtual. */
        if (vq->desc && vq->avail && vq->used)
                return dev;
@@ -481,6 +498,7 @@ translate_ring_addresses(struct virtio_net *dev, int 
vq_index)
                        dev->vid);
                return dev;
        }
+       vq->desc_packed = NULL;
 
        dev = numa_realloc(dev, vq_index);
        vq = dev->virtqueue[vq_index];
@@ -853,7 +871,8 @@ vhost_user_set_mem_table(struct virtio_net *dev, struct 
VhostUserMsg *pmsg)
 static int
 vq_is_ready(struct vhost_virtqueue *vq)
 {
-       return vq && vq->desc && vq->avail && vq->used &&
+       return vq &&
+              (vq->desc_packed || (vq->desc && vq->avail && vq->used)) &&
               vq->kickfd != VIRTIO_UNINITIALIZED_EVENTFD &&
               vq->callfd != VIRTIO_UNINITIALIZED_EVENTFD;
 }
-- 
2.14.3

Reply via email to