From d21d05c7a9c1c49ec927f961c4ab797a598af5ca Mon Sep 17 00:00:00 2001 From: Ilya Maximets Date: Wed, 9 Jan 2019 17:50:13 +0300 Subject: [PATCH] net/virtio: add barrier before reading the flags Reading the used->flags could be reordered with avail->idx update. vhost in kernel disables notifications for the time of packets receiving, like this: 1. disable notify 2. process packets 3. enable notify 4. has more packets ? goto 1 In case of reordering, virtio driver could read the flags on step 2 while notifications disabled and update avail->idx after the step 4, i.e. vhost will exit the loop on step 4 with notifications enabled, but virtio will not notify. Fixes: c1f86306a026 ("virtio: add new driver") Cc: stable@dpdk.org Reported-by: Shahaf Shuler Signed-off-by: Ilya Maximets Reviewed-by: Maxime Coquelin Acked-by: Michael S. Tsirkin --- drivers/net/virtio/virtqueue.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h index d8ae5cdec4..dffa03669e 100644 --- a/drivers/net/virtio/virtqueue.h +++ b/drivers/net/virtio/virtqueue.h @@ -415,6 +415,11 @@ vq_update_avail_ring(struct virtqueue *vq, uint16_t desc_idx) static inline int virtqueue_kick_prepare(struct virtqueue *vq) { + /* + * Ensure updated avail->idx is visible to vhost before reading + * the used->flags. + */ + virtio_mb(); return !(vq->vq_ring.used->flags & VRING_USED_F_NO_NOTIFY); } @@ -423,6 +428,9 @@ virtqueue_kick_prepare_packed(struct virtqueue *vq) { uint16_t flags; + /* + * Ensure updated data is visible to vhost before reading the flags. + */ virtio_mb(); flags = vq->ring_packed.device_event->desc_event_flags; -- 2.20.1