This patch 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.

Also, as a byproduct of using a local variable to record dropped
packets, this reduces the locking of the netdev's mutex when
multiple packets are dropped in dpdk_do_tx_copy().

Signed-off-by: Ryan Wilson <wr...@nicira.com>
---
 lib/netdev-dpdk.c |   21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 6e1d293..dfa7d77 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -658,7 +658,9 @@ 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);
@@ -666,20 +668,15 @@ dpdk_do_tx_copy(struct netdev *netdev, struct dpif_packet 
** pkts, int cnt)
             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 (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

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

Reply via email to