diff options
author | Josh Boyer <jwboyer@redhat.com> | 2013-07-03 08:29:53 -0400 |
---|---|---|
committer | Josh Boyer <jwboyer@redhat.com> | 2013-07-03 08:35:45 -0400 |
commit | af1ede06d2a0b705fb90c01df64829f83aa21eb6 (patch) | |
tree | c8544fb7029317d8f07d4c70a95bcba155eeb874 /iwl4965-better-skb-management-in-rx-path.patch | |
parent | 289de5293a33c6385da0b2e9746009774a74d373 (diff) | |
download | kernel-af1ede06d2a0b705fb90c01df64829f83aa21eb6.tar.gz kernel-af1ede06d2a0b705fb90c01df64829f83aa21eb6.tar.xz kernel-af1ede06d2a0b705fb90c01df64829f83aa21eb6.zip |
Add patches to fix iwl skb managment (rhbz 977040)
Diffstat (limited to 'iwl4965-better-skb-management-in-rx-path.patch')
-rw-r--r-- | iwl4965-better-skb-management-in-rx-path.patch | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/iwl4965-better-skb-management-in-rx-path.patch b/iwl4965-better-skb-management-in-rx-path.patch new file mode 100644 index 000000000..904ff04f6 --- /dev/null +++ b/iwl4965-better-skb-management-in-rx-path.patch @@ -0,0 +1,65 @@ +4965 version of Eric patch "iwl3945: better skb management in rx path". +It fixes several problems : + +1) skb->truesize is underestimated. + We really consume PAGE_SIZE bytes for a fragment, + not the frame length. +2) 128 bytes of initial headroom is a bit low and forces reallocations. +3) We can avoid consuming a full page for small enough frames. + +Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> +--- + drivers/net/wireless/iwlegacy/4965-mac.c | 18 ++++++++++++------ + 1 file changed, 12 insertions(+), 6 deletions(-) + +diff --git a/drivers/net/wireless/iwlegacy/4965-mac.c b/drivers/net/wireless/iwlegacy/4965-mac.c +index d287fd2..4e5d408 100644 +--- a/drivers/net/wireless/iwlegacy/4965-mac.c ++++ b/drivers/net/wireless/iwlegacy/4965-mac.c +@@ -574,9 +574,11 @@ il4965_translate_rx_status(struct il_priv *il, u32 decrypt_in) + return decrypt_out; + } + ++#define SMALL_PACKET_SIZE 256 ++ + static void + il4965_pass_packet_to_mac80211(struct il_priv *il, struct ieee80211_hdr *hdr, +- u16 len, u32 ampdu_status, struct il_rx_buf *rxb, ++ u32 len, u32 ampdu_status, struct il_rx_buf *rxb, + struct ieee80211_rx_status *stats) + { + struct sk_buff *skb; +@@ -598,21 +600,25 @@ il4965_pass_packet_to_mac80211(struct il_priv *il, struct ieee80211_hdr *hdr, + il_set_decrypted_flag(il, hdr, ampdu_status, stats)) + return; + +- skb = dev_alloc_skb(128); ++ skb = dev_alloc_skb(SMALL_PACKET_SIZE); + if (!skb) { + IL_ERR("dev_alloc_skb failed\n"); + return; + } + +- skb_add_rx_frag(skb, 0, rxb->page, (void *)hdr - rxb_addr(rxb), len, +- len); ++ if (len <= SMALL_PACKET_SIZE) { ++ memcpy(skb_put(skb, len), hdr, len); ++ } else { ++ skb_add_rx_frag(skb, 0, rxb->page, (void *)hdr - rxb_addr(rxb), ++ len, PAGE_SIZE << il->hw_params.rx_page_order); ++ il->alloc_rxb_page--; ++ rxb->page = NULL; ++ } + + il_update_stats(il, false, fc, len); + memcpy(IEEE80211_SKB_RXCB(skb), stats, sizeof(*stats)); + + ieee80211_rx(il->hw, skb); +- il->alloc_rxb_page--; +- rxb->page = NULL; + } + + /* Called for N_RX (legacy ABG frames), or +-- +1.7.11.7 + |