diff options
author | Ilya Maximets <i.maximets@samsung.com> | 2015-07-29 16:47:01 +0100 |
---|---|---|
committer | Zoltan Kiss <zoltan.kiss@linaro.org> | 2015-07-29 16:58:10 +0100 |
commit | b6dcf2264eca51c59ead5ea50ea5227bab7f3341 (patch) | |
tree | f415c9a0aeae18a0c6a318efebb4774e86f2dc96 | |
parent | 9fee61a0be5d123f075d9c25833123dfc1dc3aa8 (diff) |
netdev-odp: release unsent packets
According to ODP API the caller has to take care of unsent packets
Cc: Dyasly Sergey <s.dyasly@samsung.com>
Signed-off-by: Ilya Maximets <i.maximets@samsung.com>
Signed-off-by: Zoltan Kiss <zoltan.kiss@linaro.org>
-rw-r--r-- | lib/netdev-odp.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/lib/netdev-odp.c b/lib/netdev-odp.c index 288631c9e..e2234eaaf 100644 --- a/lib/netdev-odp.c +++ b/lib/netdev-odp.c @@ -304,7 +304,7 @@ netdev_odp_send(struct netdev *netdev, int qid OVS_UNUSED, { struct netdev_odp *dev = netdev_odp_cast(netdev); odp_packet_t odp_pkts[NETDEV_MAX_BURST]; - int pkts_ok, i; + int pkts_ok, i, sent; /* Normally NETDEV_MAX_BURST should be the limit and VLA ar nasty */ ovs_assert(cnt <= NETDEV_MAX_BURST); @@ -323,13 +323,19 @@ netdev_odp_send(struct netdev *netdev, int qid OVS_UNUSED, pkts_ok = cnt; } - odp_pktio_send(dev->pktio, odp_pkts, pkts_ok); + sent = odp_pktio_send(dev->pktio, odp_pkts, pkts_ok); + if (OVS_UNLIKELY(sent < pkts_ok)) { + sent = (sent > 0) ? sent : 0; + for (i = sent; i < pkts_ok; i++) + odp_packet_free(odp_pkts[i]); + } ovs_mutex_lock(&dev->mutex); - dev->stats.tx_packets += pkts_ok; - for (i = 0; i < pkts_ok; i++) { + dev->stats.tx_packets += sent; + for (i = 0; i < sent; i++) { dev->stats.tx_bytes += odp_packet_len(odp_pkts[i]); } + dev->stats.tx_dropped += pkts_ok - sent; ovs_mutex_unlock(&dev->mutex); return 0; |