On Thu, Jun 16, 2016 at 02:30:37AM +0800, Huawei Xie wrote: > - while (vq->vq_used_cons_idx != vq->vq_ring.used->idx) { > + while (VIRTQUEUE_NUSED(vq)) { > uint32_t idx, desc_idx, used_idx; > struct vring_used_elem *uep; > > diff --git a/drivers/net/virtio/virtio_ring.h > b/drivers/net/virtio/virtio_ring.h > index 447760a..fcecc16 100644 > --- a/drivers/net/virtio/virtio_ring.h > +++ b/drivers/net/virtio/virtio_ring.h > @@ -79,7 +79,7 @@ struct vring_used_elem { > > struct vring_used { > uint16_t flags; > - uint16_t idx; > + volatile uint16_t idx; > struct vring_used_elem ring[0]; > }; > > diff --git a/drivers/net/virtio/virtio_rxtx_simple.c > b/drivers/net/virtio/virtio_rxtx_simple.c > index 7b50119..a0ef8d2 100644 > --- a/drivers/net/virtio/virtio_rxtx_simple.c > +++ b/drivers/net/virtio/virtio_rxtx_simple.c > @@ -184,8 +184,7 @@ virtio_recv_pkts_vec(void *rx_queue, struct rte_mbuf > **rx_pkts, > if (unlikely(nb_pkts < RTE_VIRTIO_DESC_PER_LOOP)) > return 0; > > - nb_used = *(volatile uint16_t *)&vq->vq_ring.used->idx - > - vq->vq_used_cons_idx; > + nb_used = vq->vq_ring.used->idx - vq->vq_used_cons_idx;
How about replacing it with VIRTQUEUE_NUSED here? --yliu