vhost: enforce desc flags and content read ordering
authorMaxime Coquelin <maxime.coquelin@redhat.com>
Wed, 19 Dec 2018 08:21:11 +0000 (09:21 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 21 Dec 2018 15:22:41 +0000 (16:22 +0100)
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: stable@dpdk.org
Reported-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Acked-by: Ilya Maximets <i.maximets@samsung.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Acked-by: Tiwei Bie <tiwei.bie@intel.com>
lib/librte_vhost/virtio_net.c

index 7f37bbb..a9b1bc5 100644 (file)
@@ -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;