msm: ipa: Fix the memory leak on exception

on embedded data path, memory leaked on exception
data packets. Free the skb before returning.

Change-Id: I01434ce0b58b5162c8e7aec1d43a7c66a7eaac44
CRs-Fixed: 1037824
Signed-off-by: Sunil Paidimarri <hisunil@codeaurora.org>
This commit is contained in:
Sunil Paidimarri 2016-07-12 16:15:21 -07:00
parent cc915a3931
commit 451af8b02c
2 changed files with 14 additions and 10 deletions

View file

@ -1144,17 +1144,19 @@ static void apps_ipa_tx_complete_notify(void *priv,
struct net_device *dev = (struct net_device *)priv; struct net_device *dev = (struct net_device *)priv;
struct wwan_private *wwan_ptr; struct wwan_private *wwan_ptr;
if (evt != IPA_WRITE_DONE) {
IPAWANDBG("unsupported event on Tx callback\n");
return;
}
if (dev != ipa_netdevs[0]) { if (dev != ipa_netdevs[0]) {
IPAWANDBG("Received pre-SSR packet completion\n"); IPAWANDBG("Received pre-SSR packet completion\n");
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
return; return;
} }
if (evt != IPA_WRITE_DONE) {
IPAWANERR("unsupported evt on Tx callback, Drop the packet\n");
dev_kfree_skb_any(skb);
dev->stats.tx_dropped++;
return;
}
wwan_ptr = netdev_priv(dev); wwan_ptr = netdev_priv(dev);
atomic_dec(&wwan_ptr->outstanding_pkts); atomic_dec(&wwan_ptr->outstanding_pkts);
__netif_tx_lock_bh(netdev_get_tx_queue(dev, 0)); __netif_tx_lock_bh(netdev_get_tx_queue(dev, 0));

View file

@ -1157,17 +1157,19 @@ static void apps_ipa_tx_complete_notify(void *priv,
struct net_device *dev = (struct net_device *)priv; struct net_device *dev = (struct net_device *)priv;
struct ipa3_wwan_private *wwan_ptr; struct ipa3_wwan_private *wwan_ptr;
if (evt != IPA_WRITE_DONE) {
IPAWANDBG("unsupported event on Tx callback\n");
return;
}
if (dev != IPA_NETDEV()) { if (dev != IPA_NETDEV()) {
IPAWANDBG("Received pre-SSR packet completion\n"); IPAWANDBG("Received pre-SSR packet completion\n");
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
return; return;
} }
if (evt != IPA_WRITE_DONE) {
IPAWANERR("unsupported evt on Tx callback, Drop the packet\n");
dev_kfree_skb_any(skb);
dev->stats.tx_dropped++;
return;
}
wwan_ptr = netdev_priv(dev); wwan_ptr = netdev_priv(dev);
atomic_dec(&wwan_ptr->outstanding_pkts); atomic_dec(&wwan_ptr->outstanding_pkts);
__netif_tx_lock_bh(netdev_get_tx_queue(dev, 0)); __netif_tx_lock_bh(netdev_get_tx_queue(dev, 0));