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

Signed-off-by: Yuanhan Liu <yuanhan....@linux.intel.com>
---
 lib/librte_vhost/virtio_net.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/lib/librte_vhost/virtio_net.c b/lib/librte_vhost/virtio_net.c
index fd6f200..df88e31 100644
--- a/lib/librte_vhost/virtio_net.c
+++ b/lib/librte_vhost/virtio_net.c
@@ -1009,6 +1009,7 @@ dequeue_desc(struct virtio_net *dev, struct 
vhost_virtqueue *vq,
         */
        if (likely((desc->len == dev->vhost_hlen) &&
                   (desc->flags & VRING_DESC_F_NEXT) != 0)) {
+               rte_smp_wmb();
                desc->flags = 0;
 
                desc = &descs[(head_idx++) & (vq->size - 1)];
@@ -1068,11 +1069,11 @@ dequeue_desc(struct virtio_net *dev, struct 
vhost_virtqueue *vq,
 
                /* This desc reaches to its end, get the next one */
                if (desc_avail == 0) {
+                       if ((desc->flags & VRING_DESC_F_NEXT) == 0)
+                               break;
+
+                       rte_smp_wmb();
                        desc->flags = 0;
-
-                       if ((desc->flags & VRING_DESC_F_NEXT) == 0)
-                               break;
-
                        desc = &descs[(head_idx++) & (vq->size - 1)];
                        if (unlikely(desc->flags & VRING_DESC_F_INDIRECT))
                                return -1;
@@ -1111,6 +1112,7 @@ dequeue_desc(struct virtio_net *dev, struct 
vhost_virtqueue *vq,
                        mbuf_avail  = cur->buf_len - RTE_PKTMBUF_HEADROOM;
                }
        }
+       rte_smp_wmb();
        desc->flags = 0;
 
        prev->data_len = mbuf_offset;
-- 
2.7.4

Reply via email to