Currently, we check vq->desc, vq->kickfd and vq->callfd to know whether
a virtio device is ready or not. However, we only do it when handling
SET_VRING_KICK message, which could be wrong if a vhost-user frontend
send SET_VRING_KICK first and SET_VRING_CALL later.

To work for all possible vhost-user frontend implementations, we could
move the ready check at the end of vhost-user message handler.

Meanwhile, since we do the check more often than before, the "virtio
not ready" message is dropped, to not flood the screen.

Signed-off-by: Yuanhan Liu <yuanhan....@linux.intel.com>
---
 lib/librte_vhost/vhost_user.c | 32 ++++++++++++++------------------
 1 file changed, 14 insertions(+), 18 deletions(-)

diff --git a/lib/librte_vhost/vhost_user.c b/lib/librte_vhost/vhost_user.c
index fdf6f62..2a49402 100644
--- a/lib/librte_vhost/vhost_user.c
+++ b/lib/librte_vhost/vhost_user.c
@@ -605,14 +605,14 @@
        struct vhost_virtqueue *vq;
        uint32_t i;
 
+       if (dev->nr_vring == 0)
+               return 0;
+
        for (i = 0; i < dev->nr_vring; i++) {
                vq = dev->virtqueue[i];
 
-               if (!vq_is_ready(vq)) {
-                       RTE_LOG(INFO, VHOST_CONFIG,
-                               "virtio is not ready for processing.\n");
+               if (!vq_is_ready(vq))
                        return 0;
-               }
        }
 
        RTE_LOG(INFO, VHOST_CONFIG,
@@ -641,10 +641,6 @@
        vq->callfd = file.fd;
 }
 
-/*
- *  In vhost-user, when we receive kick message, will test whether virtio
- *  device is ready for packet processing.
- */
 static void
 vhost_user_set_vring_kick(struct virtio_net *dev, struct VhostUserMsg *pmsg)
 {
@@ -663,16 +659,6 @@
        if (vq->kickfd >= 0)
                close(vq->kickfd);
        vq->kickfd = file.fd;
-
-       if (virtio_is_ready(dev) && !(dev->flags & VIRTIO_DEV_RUNNING)) {
-               if (dev->dequeue_zero_copy) {
-                       RTE_LOG(INFO, VHOST_CONFIG,
-                               "dequeue zero copy is enabled\n");
-               }
-
-               if (dev->notify_ops->new_device(dev->vid) == 0)
-                       dev->flags |= VIRTIO_DEV_RUNNING;
-       }
 }
 
 static void
@@ -1065,5 +1051,15 @@
                send_vhost_message(fd, &msg);
        }
 
+       if (!(dev->flags & VIRTIO_DEV_RUNNING) && virtio_is_ready(dev)) {
+               if (dev->dequeue_zero_copy) {
+                       RTE_LOG(INFO, VHOST_CONFIG,
+                               "dequeue zero copy is enabled\n");
+               }
+
+               if (dev->notify_ops->new_device(dev->vid) == 0)
+                       dev->flags |= VIRTIO_DEV_RUNNING;
+       }
+
        return 0;
 }
-- 
1.9.0

Reply via email to