aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlya Maximets <i.maximets@samsung.com>2015-07-29 16:47:01 +0100
committerZoltan Kiss <zoltan.kiss@linaro.org>2015-07-29 16:58:10 +0100
commitb6dcf2264eca51c59ead5ea50ea5227bab7f3341 (patch)
treef415c9a0aeae18a0c6a318efebb4774e86f2dc96
parent9fee61a0be5d123f075d9c25833123dfc1dc3aa8 (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.c14
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;