[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