[ovs-dev] [PATCH 3/3] netdev-dpdk: Fix performance issues / bugs in dpdk_do_tx_copy().

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


This patch reduces locking when dpdk_do_tx_copy() by totalling
the dropped packets in a local variable before adding to the
netdev's dropped stats field.

This patch also fixes a bug where rte_pktmbuf_alloc() would fail
and packets which succeeded to allocate memory with rte_pktmbuf_alloc()
would not be sent and leak memory.

This patch also adds OVS_UNLIKELY annotations.

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

diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 6e1d293..03f1e02 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -621,7 +621,7 @@ netdev_dpdk_rxq_recv(struct netdev_rxq *rxq_, struct dpif_packet **packets,
     return 0;
 }
 
-inline static void
+static void
 dpdk_queue_pkts(struct netdev_dpdk *dev, int qid,
                struct rte_mbuf **pkts, int cnt)
 {
@@ -658,28 +658,25 @@ dpdk_do_tx_copy(struct netdev *netdev, struct dpif_packet ** pkts, int cnt)
 {
     struct netdev_dpdk *dev = netdev_dpdk_cast(netdev);
     struct rte_mbuf *mbufs[cnt];
-    int i, newcnt = 0;
+    int dropped = 0;
+    int newcnt = 0;
+    int i;
 
     for (i = 0; i < cnt; i++) {
         int size = ofpbuf_size(&pkts[i]->ofpbuf);
-        if (size > dev->max_packet_len) {
+        if (OVS_UNLIKELY(size > dev->max_packet_len)) {
             VLOG_WARN_RL(&rl, "Too big size %d max_packet_len %d",
                          (int)size , dev->max_packet_len);
 
-            ovs_mutex_lock(&dev->mutex);
-            dev->stats.tx_dropped++;
-            ovs_mutex_unlock(&dev->mutex);
-
+            dropped++;
             continue;
         }
 
         mbufs[newcnt] = rte_pktmbuf_alloc(dev->dpdk_mp->mp);
 
         if (!mbufs[newcnt]) {
-            ovs_mutex_lock(&dev->mutex);
-            dev->stats.tx_dropped++;
-            ovs_mutex_unlock(&dev->mutex);
-            return;
+            dropped += cnt - i;
+            break;
         }
 
         /* We have to do a copy for now */
@@ -691,6 +688,12 @@ dpdk_do_tx_copy(struct netdev *netdev, struct dpif_packet ** pkts, int cnt)
         newcnt++;
     }
 
+    if (OVS_UNLIKELY(dropped)) {
+        ovs_mutex_lock(&dev->mutex);
+        dev->stats.tx_dropped += dropped;
+        ovs_mutex_unlock(&dev->mutex);
+    }
+
     dpdk_queue_pkts(dev, NON_PMD_THREAD_TX_QUEUE, mbufs, newcnt);
     dpdk_queue_flush(dev, NON_PMD_THREAD_TX_QUEUE);
 }
-- 
1.7.9.5




More information about the dev mailing list