summaryrefslogtreecommitdiffstats
path: root/net/mac80211
diff options
context:
space:
mode:
authorIdo Yariv2014-07-29 14:39:14 +0200
committerJohannes Berg2014-08-26 11:16:00 +0200
commitc70f59a2a007c57843195a93c3b7308204e0a5ab (patch)
treedb9426d7dbadd28f97c006b6426ac1e3cbca880c /net/mac80211
parentmac80211: Fix accounting of the tailroom-needed counter (diff)
downloadkernel-qcow2-linux-c70f59a2a007c57843195a93c3b7308204e0a5ab.tar.gz
kernel-qcow2-linux-c70f59a2a007c57843195a93c3b7308204e0a5ab.tar.xz
kernel-qcow2-linux-c70f59a2a007c57843195a93c3b7308204e0a5ab.zip
mac80211: don't resize skbs needlessly
Header-less cloned skbs with sufficient headroom need not be cloned unless the tailroom is going to be modified. Fix ieee80211_skb_resize so it would only resize cloned skbs if either the header isn't released or the tailroom is going to be modified. Some drivers might have assumed that skbs are never cloned, so add a HW flag that explicitly permits cloned TX skbs. Drivers which do not modify TX skbs should set this flag to avoid copying skbs. Signed-off-by: Ido Yariv <idox.yariv@intel.com> Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211')
-rw-r--r--net/mac80211/tx.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index 2051cc60f8ce..925c39f4099e 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -1478,7 +1478,10 @@ static int ieee80211_skb_resize(struct ieee80211_sub_if_data *sdata,
tail_need = max_t(int, tail_need, 0);
}
- if (skb_cloned(skb))
+ if (skb_cloned(skb) &&
+ (!(local->hw.flags & IEEE80211_HW_SUPPORTS_CLONED_SKBS) ||
+ !skb_clone_writable(skb, ETH_HLEN) ||
+ sdata->crypto_tx_tailroom_needed_cnt))
I802_DEBUG_INC(local->tx_expand_skb_head_cloned);
else if (head_need || tail_need)
I802_DEBUG_INC(local->tx_expand_skb_head);