mirror of
https://github.com/openvswitch/ovs
synced 2025-10-27 15:18:06 +00:00
netdev-dpdk: Fix memory leak in dpdk_do_tx_copy().
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 <wryan@nicira.com> Acked-by: Daniele Di Proietto <ddiproietto@vmware.com> Acked-by: Pravin B Shelar <pshelar@nicira.com>
This commit is contained in:
committed by
Pravin B Shelar
parent
844f2d749a
commit
175cf4de3f
@@ -661,7 +661,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);
|
||||
@@ -669,20 +671,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 */
|
||||
@@ -694,6 +691,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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user