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 <wr...@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 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev