vhost: enable rings at the right time
authorMaxime Coquelin <maxime.coquelin@redhat.com>
Thu, 5 Oct 2017 08:36:21 +0000 (10:36 +0200)
committerYuanhan Liu <yliu@fridaylinux.org>
Tue, 10 Oct 2017 13:52:27 +0000 (15:52 +0200)
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.coquelin@redhat.com>
Acked-by: Yuanhan Liu <yliu@fridaylinux.org>
lib/librte_vhost/vhost.c
lib/librte_vhost/vhost_user.c

index 6e55116..5a5ee3b 100644 (file)
@@ -159,12 +159,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);
 }
 
index bcfd28f..3b934a7 100644 (file)
@@ -699,6 +699,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;