> 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.
These sound like three separate patches. How much if at all does each thing help? Ethan > > Signed-off-by: Ryan Wilson <[email protected]> > --- > 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 > [email protected] > http://openvswitch.org/mailman/listinfo/dev _______________________________________________ dev mailing list [email protected] http://openvswitch.org/mailman/listinfo/dev
