diff options
author | Josh Boyer <jwboyer@fedoraproject.org> | 2013-09-06 08:47:34 -0400 |
---|---|---|
committer | Josh Boyer <jwboyer@fedoraproject.org> | 2013-09-06 08:47:34 -0400 |
commit | 4eae13708d3d85606e547112ad9279ea62d05b37 (patch) | |
tree | 909fb410da934daeaf9a33770ed77ba564c18491 /iwl3945-better-skb-management-in-rx-path.patch | |
parent | eca31b7aafe7694993440f34b7d78dc28a5d4287 (diff) | |
download | kernel-4eae13708d3d85606e547112ad9279ea62d05b37.tar.gz kernel-4eae13708d3d85606e547112ad9279ea62d05b37.tar.xz kernel-4eae13708d3d85606e547112ad9279ea62d05b37.zip |
Linux v3.11-6422-g2e03285
Diffstat (limited to 'iwl3945-better-skb-management-in-rx-path.patch')
-rw-r--r-- | iwl3945-better-skb-management-in-rx-path.patch | 97 |
1 files changed, 0 insertions, 97 deletions
diff --git a/iwl3945-better-skb-management-in-rx-path.patch b/iwl3945-better-skb-management-in-rx-path.patch deleted file mode 100644 index 5d85af7d4..000000000 --- a/iwl3945-better-skb-management-in-rx-path.patch +++ /dev/null @@ -1,97 +0,0 @@ -From: Eric Dumazet <edumazet@google.com> - -Steinar reported reallocations of skb->head with IPv6, leading to -a warning in skb_try_coalesce() - -It turns out iwl3945 has 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. - -Reported-by: Steinar H. Gunderson <sesse@google.com> -Signed-off-by: Eric Dumazet <edumazet@google.com> -Cc: Paul Stewart <pstew@google.com> ---- -v3: use regular memcpy(skb_put(...),...) -v2: SMALL_PACKET_SIZE define - - drivers/net/wireless/iwlegacy/3945.c | 31 +++++++++++++++---------- - 1 file changed, 19 insertions(+), 12 deletions(-) - -diff --git a/drivers/net/wireless/iwlegacy/3945.c b/drivers/net/wireless/iwlegacy/3945.c -index c092033..f09e257 100644 ---- a/drivers/net/wireless/iwlegacy/3945.c -+++ b/drivers/net/wireless/iwlegacy/3945.c -@@ -475,6 +475,8 @@ il3945_is_network_packet(struct il_priv *il, struct ieee80211_hdr *header) - } - } - -+#define SMALL_PACKET_SIZE 256 -+ - static void - il3945_pass_packet_to_mac80211(struct il_priv *il, struct il_rx_buf *rxb, - struct ieee80211_rx_status *stats) -@@ -483,14 +485,13 @@ il3945_pass_packet_to_mac80211(struct il_priv *il, struct il_rx_buf *rxb, - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)IL_RX_DATA(pkt); - struct il3945_rx_frame_hdr *rx_hdr = IL_RX_HDR(pkt); - struct il3945_rx_frame_end *rx_end = IL_RX_END(pkt); -- u16 len = le16_to_cpu(rx_hdr->len); -+ u32 len = le16_to_cpu(rx_hdr->len); - struct sk_buff *skb; - __le16 fc = hdr->frame_control; -+ u32 fraglen = PAGE_SIZE << il->hw_params.rx_page_order; - - /* We received data from the HW, so stop the watchdog */ -- if (unlikely -- (len + IL39_RX_FRAME_SIZE > -- PAGE_SIZE << il->hw_params.rx_page_order)) { -+ if (unlikely(len + IL39_RX_FRAME_SIZE > fraglen)) { - D_DROP("Corruption detected!\n"); - return; - } -@@ -506,26 +507,32 @@ il3945_pass_packet_to_mac80211(struct il_priv *il, struct il_rx_buf *rxb, - D_INFO("Woke queues - frame received on passive channel\n"); - } - -- skb = dev_alloc_skb(128); -+ skb = dev_alloc_skb(SMALL_PACKET_SIZE); - if (!skb) { - IL_ERR("dev_alloc_skb failed\n"); - return; - } - - if (!il3945_mod_params.sw_crypto) -- il_set_decrypted_flag(il, (struct ieee80211_hdr *)rxb_addr(rxb), -+ il_set_decrypted_flag(il, (struct ieee80211_hdr *)pkt, - le32_to_cpu(rx_end->status), stats); - -- skb_add_rx_frag(skb, 0, rxb->page, -- (void *)rx_hdr->payload - (void *)pkt, len, -- len); -- -+ /* If frame is small enough to fit into skb->head, copy it -+ * and do not consume a full page -+ */ -+ if (len <= SMALL_PACKET_SIZE) { -+ memcpy(skb_put(skb, len), rx_hdr->payload, len); -+ } else { -+ skb_add_rx_frag(skb, 0, rxb->page, -+ (void *)rx_hdr->payload - (void *)pkt, len, -+ fraglen); -+ 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; - } - - #define IL_DELAY_NEXT_SCAN_AFTER_ASSOC (HZ*6) - - |