net/virtio: free in-order descriptors before device start
authorMarvin Liu <yong.liu@intel.com>
Mon, 2 Jul 2018 13:56:38 +0000 (21:56 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 2 Jul 2018 23:35:58 +0000 (01:35 +0200)
Add new function for freeing IN_ORDER descriptors. As descriptors will
be allocated and freed sequentially when IN_ORDER feature was
negotiated. There will be no need to utilize chain for freed descriptors
management, only index update is enough.

Signed-off-by: Marvin Liu <yong.liu@intel.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
drivers/net/virtio/virtio_rxtx.c
drivers/net/virtio/virtqueue.c
drivers/net/virtio/virtqueue.h

index 92fab21..0bca298 100644 (file)
@@ -47,6 +47,13 @@ virtio_dev_rx_queue_done(void *rxq, uint16_t offset)
        return VIRTQUEUE_NUSED(vq) >= offset;
 }
 
+void
+vq_ring_free_inorder(struct virtqueue *vq, uint16_t desc_idx, uint16_t num)
+{
+       vq->vq_free_cnt += num;
+       vq->vq_desc_tail_idx = desc_idx & (vq->vq_nentries - 1);
+}
+
 void
 vq_ring_free_chain(struct virtqueue *vq, uint16_t desc_idx)
 {
index a7d0a9c..56a77cc 100644 (file)
@@ -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;
+                       }
+                       vq_ring_free_inorder(vq, desc_idx, 1);
                } else {
                        desc_idx = (uint16_t)uep->id;
                        dxp = &vq->vq_descx[desc_idx];
index 14364f3..26518ed 100644 (file)
@@ -306,6 +306,8 @@ virtio_get_queue_type(struct virtio_hw *hw, uint16_t vtpci_queue_idx)
 #define VIRTQUEUE_NUSED(vq) ((uint16_t)((vq)->vq_ring.used->idx - (vq)->vq_used_cons_idx))
 
 void vq_ring_free_chain(struct virtqueue *vq, uint16_t desc_idx);
+void vq_ring_free_inorder(struct virtqueue *vq, uint16_t desc_idx,
+                         uint16_t num);
 
 static inline void
 vq_update_avail_idx(struct virtqueue *vq)