On Fri, Jun 08, 2018 at 05:07:23PM +0800, Marvin Liu wrote: [...] > > @@ -634,6 +634,24 @@ virtio_dev_rx_queue_setup_finish(struct rte_eth_dev > *dev, uint16_t queue_idx) > virtio_rxq_rearm_vec(rxvq); > nbufs += RTE_VIRTIO_VPMD_RX_REARM_THRESH; > } > + } else if (hw->use_inorder_rx) { > + if ((!virtqueue_full(vq))) { > + uint16_t free_cnt = vq->vq_free_cnt; > + struct rte_mbuf *pkts[free_cnt]; > + > + if (!rte_pktmbuf_alloc_bulk(rxvq->mpool, pkts, > free_cnt)) { > + error = virtqueue_enqueue_inorder_refill(vq, > + pkts, > + free_cnt); > + if (unlikely(error)) { > + for (i = 0; i < free_cnt; i++) > + rte_pktmbuf_free(pkts[i]); > + } > + } > + > + nbufs += free_cnt; > + vq_update_avail_idx(vq);
It looks a bit weird to introduce above code in this patch. > + } > } else { > while (!virtqueue_full(vq)) { > m = rte_mbuf_raw_alloc(rxvq->mpool); > diff --git a/drivers/net/virtio/virtqueue.c b/drivers/net/virtio/virtqueue.c > index a7d0a9cbe..56a77cc71 100644 > --- a/drivers/net/virtio/virtqueue.c > +++ b/drivers/net/virtio/virtqueue.c > @@ -74,6 +74,14 @@ virtqueue_rxvq_flush(struct virtqueue *vq) > desc_idx = used_idx; > rte_pktmbuf_free(vq->sw_ring[desc_idx]); > vq->vq_free_cnt++; > + } else if (hw->use_inorder_rx) { > + desc_idx = (uint16_t)uep->id; > + dxp = &vq->vq_descx[desc_idx]; > + if (dxp->cookie != NULL) { > + rte_pktmbuf_free(dxp->cookie); > + dxp->cookie = NULL; > + } Ditto. > + vq_ring_free_inorder(vq, desc_idx, 1); > } else { > desc_idx = (uint16_t)uep->id; > dxp = &vq->vq_descx[desc_idx]; > -- > 2.17.0 >