A read barrier is required to ensure that the ordering between
descriptor's flags and content reads is enforced.

1. read flags = desc->flags
if (flags & AVAIL_BIT)
2.   read desc->id

There is a control dependency between steps 1 and step 2.
2 could be speculatively executed before 1, which could result
in 'id' to not be updated yet.

Fixes: 2f3225a7d69b ("vhost: add vector filling support for packed ring")
Cc: sta...@dpdk.org

Reported-by: Jason Wang <jasow...@redhat.com>
Signed-off-by: Maxime Coquelin <maxime.coque...@redhat.com>
Acked-by: Ilya Maximets <i.maxim...@samsung.com>
---
 lib/librte_vhost/virtio_net.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/lib/librte_vhost/virtio_net.c b/lib/librte_vhost/virtio_net.c
index 7f37bbbed..a9b1bc55f 100644
--- a/lib/librte_vhost/virtio_net.c
+++ b/lib/librte_vhost/virtio_net.c
@@ -481,6 +481,12 @@ fill_vec_buf_packed(struct virtio_net *dev, struct 
vhost_virtqueue *vq,
        if (unlikely(!desc_is_avail(&descs[avail_idx], wrap_counter)))
                return -1;
 
+       /*
+        * The ordering between desc flags and desc
+        * content reads need to be enforced.
+        */
+       rte_smp_rmb();
+
        *desc_count = 0;
        *len = 0;
 
-- 
2.17.2

Reply via email to