On Fri, Jan 19, 2018 at 04:55:53PM +0100, Olivier Matz wrote: > When using vector Rx mode (use_simple_rx = 1), vq->vq_descx[] is not > kept up to date. To properly detach the mbufs in this case, browse > sw_ring[] instead, as it's done in virtqueue_rxvq_flush(). > > Since we need virtio_get_queue_type(), also move this function in > virtqueue.h as a static inline. > > Fixes: fc3d66212fed ("virtio: add vector Rx") > Cc: sta...@dpdk.org > > Signed-off-by: Olivier Matz <olivier.m...@6wind.com> > --- > > Tiwei, > > While it passes my test plan, please carefully check that what I did in > virtqueue_detatch_unused() is correct. I tried to reproduce what is done > in virtqueue_rxvq_flush(), but I may be mistaking due to the different > ring layout assumption and mbuf management between standard and vector. > > Thanks > Olivier > > > drivers/net/virtio/virtio_ethdev.c | 11 ----------- > drivers/net/virtio/virtqueue.c | 17 +++++++++++++++-- > drivers/net/virtio/virtqueue.h | 11 +++++++++++ > 3 files changed, 26 insertions(+), 13 deletions(-) > [...] > struct rte_mbuf * > virtqueue_detatch_unused(struct virtqueue *vq) > { > + struct virtio_hw *hw = vq->hw; > struct rte_mbuf *cookie; > int idx; > + int type = virtio_get_queue_type(hw, vq->vq_queue_index); > + > + if (vq == NULL) > + return NULL; > > - if (vq != NULL) > - for (idx = 0; idx < vq->vq_nentries; idx++) { > + for (idx = 0; idx < vq->vq_nentries; idx++) { > + if (hw->use_simple_rx && type == VTNET_RQ) { > + cookie = vq->sw_ring[idx]; > + if (cookie != NULL) { > + vq->sw_ring[idx] = NULL;
Thanks for working on this! The vq->sw_ring[idx] isn't zeroed during Rx. So besides the check of (cookie != NULL), some other check is also needed to avoid freeing the mbufs already delivered to application. The mbufs in below interval belong to application: start: sw_ring[vq->vq_avail_idx & (vq->vq_nentries - 1)] (included) end: sw_ring[(vq->vq_avail_idx + vq->vq_free_cnt) & (vq->vq_nentries - 1)] (excluded) PS. (vq->vq_avail_idx & (vq->vq_nentries - 1)) can be greater than (vq->vq_avail_idx + vq->vq_free_cnt) & (vq->vq_nentries - 1). Thanks, Tiwei