[ovs-dev] [PATCH 1/3] netdev-dpdk: Refactor dpdk_queue_flush().

Ryan Wilson wryan at nicira.com
Fri Jun 27 00:41:45 UTC 2014


This patch refactors dpdk_queue_flush() to reuse code in
dpdk_queue_pkts().

Signed-off-by: Ryan Wilson <wryan at nicira.com>
---
 lib/netdev-dpdk.c |   37 ++++++++++++++++---------------------
 1 file changed, 16 insertions(+), 21 deletions(-)

diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 72add87..084e8cd 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -567,16 +567,12 @@ netdev_dpdk_rxq_dealloc(struct netdev_rxq *rxq_)
     rte_free(rx);
 }
 
-inline static void
-dpdk_queue_flush(struct netdev_dpdk *dev, int qid)
+static void
+dpdk_queue_flush__(struct netdev_dpdk *dev, int qid)
 {
     struct dpdk_tx_queue *txq = &dev->tx_q[qid];
     uint32_t nb_tx;
 
-    if (txq->count == 0) {
-        return;
-    }
-    rte_spinlock_lock(&txq->tx_lock);
     nb_tx = rte_eth_tx_burst(dev->port_id, qid, txq->burst_pkts, txq->count);
     if (nb_tx != txq->count) {
         /* free buffers if we couldn't transmit packets */
@@ -585,6 +581,18 @@ dpdk_queue_flush(struct netdev_dpdk *dev, int qid)
                              (txq->count - nb_tx));
     }
     txq->count = 0;
+}
+
+static void
+dpdk_queue_flush(struct netdev_dpdk *dev, int qid)
+{
+    struct dpdk_tx_queue *txq = &dev->tx_q[qid];
+
+    if (txq->count == 0) {
+        return;
+    }
+    rte_spinlock_lock(&txq->tx_lock);
+    dpdk_queue_flush__(dev, qid);
     rte_spinlock_unlock(&txq->tx_lock);
 }
 
@@ -619,7 +627,6 @@ dpdk_queue_pkts(struct netdev_dpdk *dev, int qid,
     struct dpdk_tx_queue *txq = &dev->tx_q[qid];
     uint64_t diff_tsc;
     uint64_t cur_tsc;
-    uint32_t nb_tx;
 
     int i = 0;
 
@@ -635,7 +642,7 @@ dpdk_queue_pkts(struct netdev_dpdk *dev, int qid,
         i += tocopy;
 
         if (txq->count == MAX_TX_QUEUE_LEN) {
-            goto flush;
+            dpdk_queue_flush__(dev, qid);
         }
         cur_tsc = rte_get_timer_cycles();
         if (txq->count == 1) {
@@ -643,20 +650,8 @@ dpdk_queue_pkts(struct netdev_dpdk *dev, int qid,
         }
         diff_tsc = cur_tsc - txq->tsc;
         if (diff_tsc >= DRAIN_TSC) {
-            goto flush;
-        }
-        continue;
-
-    flush:
-        nb_tx = rte_eth_tx_burst(dev->port_id, qid, txq->burst_pkts,
-                                 txq->count);
-        if (nb_tx != txq->count) {
-            /* free buffers if we couldn't transmit packets */
-            rte_mempool_put_bulk(dev->dpdk_mp->mp,
-                                 (void **) &txq->burst_pkts[nb_tx],
-                                 (txq->count - nb_tx));
+            dpdk_queue_flush__(dev, qid);
         }
-        txq->count = 0;
     }
     rte_spinlock_unlock(&txq->tx_lock);
 }
-- 
1.7.9.5




More information about the dev mailing list