[dpdk-stable] [PATCH 17.11] net/virtio: add barrier before reading the flags

Yongseok Koh yskoh at mellanox.com
Wed Mar 27 19:30:33 CET 2019


> On Mar 13, 2019, at 8:27 AM, Ilya Maximets <i.maximets at samsung.com> wrote:
> 
> [ backported from upstream commit d21d05c7a9c1c49ec927f961c4ab797a598af5ca ]
> 
> 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 at dpdk.org
> 
> Reported-by: Shahaf Shuler <shahafs at mellanox.com>
> Signed-off-by: Ilya Maximets <i.maximets at samsung.com>
> Reviewed-by: Maxime Coquelin <maxime.coquelin at redhat.com>
> Acked-by: Michael S. Tsirkin <mst at redhat.com>
> ---
applied to stable/17.11

Thanks,
Yongseok


> drivers/net/virtio/virtqueue.h | 5 +++++
> 1 file changed, 5 insertions(+)
> 
> diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h
> index 788d04dfa..6efd4f01c 100644
> --- a/drivers/net/virtio/virtqueue.h
> +++ b/drivers/net/virtio/virtqueue.h
> @@ -354,6 +354,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);
> }
> 
> -- 
> 2.17.1
> 



More information about the stable mailing list