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