Signed-off-by: Tiwei Bie <tiwei....@intel.com>
---
 lib/librte_vhost/vhost.c      |  4 ++++
 lib/librte_vhost/vhost_user.c | 17 +++++++++++++++--
 2 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/lib/librte_vhost/vhost.c b/lib/librte_vhost/vhost.c
index 19c5a43..b7bc1ee 100644
--- a/lib/librte_vhost/vhost.c
+++ b/lib/librte_vhost/vhost.c
@@ -441,6 +441,10 @@ rte_vhost_enable_guest_notification(int vid, uint16_t 
queue_id, int enable)
                return -1;
        }
 
+       if (dev->features & (1ULL << VIRTIO_F_VERSION_1_1)) {
+               return 0;
+       }
+
        dev->virtqueue[queue_id]->used->flags = VRING_USED_F_NO_NOTIFY;
        return 0;
 }
diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c
index 3a2de79..9265dcb 100644
--- a/lib/librte_vhost/vhost_user.c
+++ b/lib/librte_vhost/vhost_user.c
@@ -342,6 +342,19 @@ vhost_user_set_vring_addr(struct virtio_net *dev, 
VhostUserMsg *msg)
        /* addr->index refers to the queue index. The txq 1, rxq is 0. */
        vq = dev->virtqueue[msg->payload.addr.index];
 
+       if (dev->features & (1ULL << VIRTIO_F_VERSION_1_1)) {
+               vq->desc_1_1 = (struct vring_desc_1_1 *)(uintptr_t)qva_to_vva
+                                       (dev, msg->payload.addr.desc_user_addr);
+               vq->desc = NULL;
+               vq->avail = NULL;
+               vq->used = NULL;
+               vq->log_guest_addr = 0;
+
+               assert(vq->last_used_idx == 0);
+
+               return 0;
+       }
+
        /* The addresses are converted from QEMU virtual to Vhost virtual. */
        vq->desc = (struct vring_desc *)(uintptr_t)qva_to_vva(dev,
                        msg->payload.addr.desc_user_addr);
@@ -351,7 +364,7 @@ vhost_user_set_vring_addr(struct virtio_net *dev, 
VhostUserMsg *msg)
                        dev->vid);
                return -1;
        }
-       vq->desc_1_1 = (struct vring_desc_1_1 *)vq->desc;
+       vq->desc_1_1 = NULL;
 
        dev = numa_realloc(dev, msg->payload.addr.index);
        vq = dev->virtqueue[msg->payload.addr.index];
@@ -617,7 +630,7 @@ 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   &&
+       return vq && (vq->desc || vq->desc_1_1) &&
               vq->kickfd != VIRTIO_UNINITIALIZED_EVENTFD &&
               vq->callfd != VIRTIO_UNINITIALIZED_EVENTFD;
 }
-- 
2.7.4

Reply via email to