aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath10k/txrx.c
diff options
context:
space:
mode:
authorMichal Kazior <michal.kazior@tieto.com>2013-09-18 08:43:22 -0400
committerKalle Valo <kvalo@qca.qualcomm.com>2013-09-20 01:18:10 -0400
commit1f8bb1518eee321d94477ca7bcbb153c47d43ba4 (patch)
tree1d2242d63ab28b1de5c4a67b5b749ba8fd1a9437 /drivers/net/wireless/ath/ath10k/txrx.c
parent2f3773bcaf9fbf3ddb9d4315e3a3ca5e4b376cef (diff)
ath10k: use msdu headroom to store txfrag
Instead of allocating sk_buff for a mere 16-byte tx fragment list buffer use headroom of the original msdu sk_buff. This decreases CPU cache pressure and improves performance. Measured improvement on AP135 is 560mbps -> 590mbps of UDP TX briding traffic. Signed-off-by: Michal Kazior <michal.kazior@tieto.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath10k/txrx.c')
-rw-r--r--drivers/net/wireless/ath/ath10k/txrx.c16
1 files changed, 6 insertions, 10 deletions
diff --git a/drivers/net/wireless/ath/ath10k/txrx.c b/drivers/net/wireless/ath/ath10k/txrx.c
index 15395afae957..57931d0fae4b 100644
--- a/drivers/net/wireless/ath/ath10k/txrx.c
+++ b/drivers/net/wireless/ath/ath10k/txrx.c
@@ -49,7 +49,8 @@ void ath10k_txrx_tx_unref(struct ath10k_htt *htt,
49{ 49{
50 struct device *dev = htt->ar->dev; 50 struct device *dev = htt->ar->dev;
51 struct ieee80211_tx_info *info; 51 struct ieee80211_tx_info *info;
52 struct sk_buff *msdu, *txfrag; 52 struct ath10k_skb_cb *skb_cb;
53 struct sk_buff *msdu;
53 int ret; 54 int ret;
54 55
55 ath10k_dbg(ATH10K_DBG_HTT, "htt tx completion msdu_id %u discard %d no_ack %d\n", 56 ath10k_dbg(ATH10K_DBG_HTT, "htt tx completion msdu_id %u discard %d no_ack %d\n",
@@ -62,20 +63,15 @@ void ath10k_txrx_tx_unref(struct ath10k_htt *htt,
62 } 63 }
63 64
64 msdu = htt->pending_tx[tx_done->msdu_id]; 65 msdu = htt->pending_tx[tx_done->msdu_id];
65 txfrag = ATH10K_SKB_CB(msdu)->htt.txfrag; 66 skb_cb = ATH10K_SKB_CB(msdu);
66
67 if (txfrag) {
68 ret = ath10k_skb_unmap(dev, txfrag);
69 if (ret)
70 ath10k_warn("txfrag unmap failed (%d)\n", ret);
71
72 dev_kfree_skb_any(txfrag);
73 }
74 67
75 ret = ath10k_skb_unmap(dev, msdu); 68 ret = ath10k_skb_unmap(dev, msdu);
76 if (ret) 69 if (ret)
77 ath10k_warn("data skb unmap failed (%d)\n", ret); 70 ath10k_warn("data skb unmap failed (%d)\n", ret);
78 71
72 if (skb_cb->htt.frag_len)
73 skb_pull(msdu, skb_cb->htt.frag_len + skb_cb->htt.pad_len);
74
79 ath10k_report_offchan_tx(htt->ar, msdu); 75 ath10k_report_offchan_tx(htt->ar, msdu);
80 76
81 info = IEEE80211_SKB_CB(msdu); 77 info = IEEE80211_SKB_CB(msdu);