diff options
author | Michal Kazior <michal.kazior@tieto.com> | 2013-09-18 08:43:22 -0400 |
---|---|---|
committer | Kalle Valo <kvalo@qca.qualcomm.com> | 2013-09-20 01:18:10 -0400 |
commit | 1f8bb1518eee321d94477ca7bcbb153c47d43ba4 (patch) | |
tree | 1d2242d63ab28b1de5c4a67b5b749ba8fd1a9437 /drivers/net/wireless/ath/ath10k/txrx.c | |
parent | 2f3773bcaf9fbf3ddb9d4315e3a3ca5e4b376cef (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.c | 16 |
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); |