From 48cae0bfa60c451c5d9c0d5be932300aadc7e676 Mon Sep 17 00:00:00 2001 From: Ilya Maximets Date: Wed, 5 Dec 2018 18:09:26 +0300 Subject: [PATCH] vhost: fix double read of descriptor flags Flags could be updated in a separate process leading to the inconsistent check. Additionally, read marked as 'volatile' to highlight the shared nature of the variable and avoid such issues in the future. Fixes: d3211c98c456 ("vhost: add helpers for packed virtqueues") Cc: stable@dpdk.org Signed-off-by: Ilya Maximets Reviewed-by: Maxime Coquelin --- lib/librte_vhost/vhost.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/librte_vhost/vhost.h b/lib/librte_vhost/vhost.h index 5218f1b12d..552b9298d2 100644 --- a/lib/librte_vhost/vhost.h +++ b/lib/librte_vhost/vhost.h @@ -393,8 +393,10 @@ vq_is_packed(struct virtio_net *dev) static inline bool desc_is_avail(struct vring_packed_desc *desc, bool wrap_counter) { - return wrap_counter == !!(desc->flags & VRING_DESC_F_AVAIL) && - wrap_counter != !!(desc->flags & VRING_DESC_F_USED); + uint16_t flags = *((volatile uint16_t *) &desc->flags); + + return wrap_counter == !!(flags & VRING_DESC_F_AVAIL) && + wrap_counter != !!(flags & VRING_DESC_F_USED); } #define VHOST_LOG_PAGE 4096