rte_eth_tx_burst() _should_ transmit every packet that it is passed unless the
queue is full. Nontheless some implementation of rte_eth_tx_burst (e.g.
ixgbe_xmit_pkts_vec()) does not transmit more than a fixed number (32) of
packets at a time.

With this commit we assume that there's an error only if rte_eth_tx_burst
returns 0.

Signed-off-by: Daniele Di Proietto <ddiproie...@vmware.com>
---
 lib/netdev-dpdk.c | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)

diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index f2202b4..97206e6 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -621,9 +621,20 @@ static inline void
 dpdk_queue_flush__(struct netdev_dpdk *dev, int qid)
 {
     struct dpdk_tx_queue *txq = &dev->tx_q[qid];
-    uint32_t nb_tx;
+    uint32_t nb_tx = 0;
+
+    while (nb_tx != txq->count) {
+        uint32_t ret;
+        
+        ret = rte_eth_tx_burst(dev->port_id, qid, txq->burst_pkts + nb_tx,
+                               txq->count - nb_tx);
+        if (!ret) {
+            break;
+        }
+
+        nb_tx += ret;
+    }
 
-    nb_tx = rte_eth_tx_burst(dev->port_id, qid, txq->burst_pkts, txq->count);
     if (OVS_UNLIKELY(nb_tx != txq->count)) {
         /* free buffers, which we couldn't transmit, one at a time (each
          * packet could come from a different mempool) */
@@ -632,7 +643,11 @@ dpdk_queue_flush__(struct netdev_dpdk *dev, int qid)
         for (i = nb_tx; i < txq->count; i++) {
             rte_pktmbuf_free_seg(txq->burst_pkts[i]);
         }
+        ovs_mutex_lock(&dev->mutex);
+        dev->stats.tx_dropped += txq->count-nb_tx;
+        ovs_mutex_unlock(&dev->mutex);
     }
+
     txq->count = 0;
     txq->tsc = rte_get_timer_cycles();
 }
-- 
2.0.1

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to