[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