summaryrefslogtreecommitdiffstats
path: root/iwl3945-better-skb-management-in-rx-path.patch
diff options
context:
space:
mode:
authorJosh Boyer <jwboyer@fedoraproject.org>2013-09-06 08:47:34 -0400
committerJosh Boyer <jwboyer@fedoraproject.org>2013-09-06 08:47:34 -0400
commit4eae13708d3d85606e547112ad9279ea62d05b37 (patch)
tree909fb410da934daeaf9a33770ed77ba564c18491 /iwl3945-better-skb-management-in-rx-path.patch
parenteca31b7aafe7694993440f34b7d78dc28a5d4287 (diff)
downloadkernel-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.patch97
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)
-
-