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: sta...@dpdk.org Signed-off-by: Ilya Maximets <i.maxim...@samsung.com> --- 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 5218f1b12..84cbee2b6 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 -- 2.17.1