When VHOST_USER_F_PROTOCOL_FEATURES is negotiated, the ring is not
enabled when started, but enabled through dedicated
VHOST_USER_SET_VRING_ENABLE request.

When not negotiated, the ring is started in enabled state, at
VHOST_USER_SET_VRING_KICK request time.

Signed-off-by: Maxime Coquelin <maxime.coque...@redhat.com>
---
 lib/librte_vhost/vhost.c      | 6 ------
 lib/librte_vhost/vhost_user.c | 9 +++++++++
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/lib/librte_vhost/vhost.c b/lib/librte_vhost/vhost.c
index 0e8c0386a..ccfc17022 100644
--- a/lib/librte_vhost/vhost.c
+++ b/lib/librte_vhost/vhost.c
@@ -238,12 +238,6 @@ init_vring_queue(struct virtio_net *dev, uint32_t 
vring_idx)
        /* Backends are set to -1 indicating an inactive device. */
        vq->backend = -1;
 
-       /*
-        * always set the vq to enabled; this is to keep compatibility
-        * with the old QEMU, whereas there is no SET_VRING_ENABLE message.
-        */
-       vq->enabled = 1;
-
        TAILQ_INIT(&vq->zmbuf_list);
 }
 
diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c
index 1cabba73f..4f9273fe7 100644
--- a/lib/librte_vhost/vhost_user.c
+++ b/lib/librte_vhost/vhost_user.c
@@ -660,6 +660,15 @@ vhost_user_set_vring_kick(struct virtio_net *dev, struct 
VhostUserMsg *pmsg)
                "vring kick idx:%d file:%d\n", file.index, file.fd);
 
        vq = dev->virtqueue[file.index];
+
+       /*
+        * When VHOST_USER_F_PROTOCOL_FEATURES is not negotiated,
+        * the ring starts already enabled. Otherwise, it is enabled via
+        * the SET_VRING_ENABLE message.
+        */
+       if (!(dev->features & (1ULL << VHOST_USER_F_PROTOCOL_FEATURES)))
+               vq->enabled = 1;
+
        if (vq->kickfd >= 0)
                close(vq->kickfd);
        vq->kickfd = file.fd;
-- 
2.13.3

Reply via email to