p54usb: Fix to prevent SKB memory allocation errors with 4K page size
authorLarry Finger <Larry.Finger@lwfinger.net>
Sat, 3 Jan 2009 18:45:12 +0000 (12:45 -0600)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 12 Jan 2009 19:24:49 +0000 (14:24 -0500)
On x86_64 architecture with 4K page size and SLUB debugging enabled, stress
testing on p54usb has resulted in skb allocation failures of O(1) and extreme
page fragmentation. Reducing rx_mtu fixes this problem by reducing the size of
all receive skb allocations to be of O(0). This change does not impact
performance in any way.

Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/p54/p54common.c

index 82354b974a04773e752307f45f393bed8a89763c..06c64744df27fe452cd6382c7ed66eaee20fe60a 100644 (file)
@@ -138,6 +138,7 @@ int p54_parse_firmware(struct ieee80211_hw *dev, const struct firmware *fw)
        u8 *fw_version = NULL;
        size_t len;
        int i;
+       int maxlen;
 
        if (priv->rx_start)
                return 0;
@@ -195,6 +196,16 @@ int p54_parse_firmware(struct ieee80211_hw *dev, const struct firmware *fw)
                        else
                                priv->rx_mtu = (size_t)
                                        0x620 - priv->tx_hdr_len;
+                       maxlen = priv->tx_hdr_len + /* USB devices */
+                                sizeof(struct p54_rx_data) +
+                                4 + /* rx alignment */
+                                IEEE80211_MAX_FRAG_THRESHOLD;
+                       if (priv->rx_mtu > maxlen && PAGE_SIZE == 4096) {
+                               printk(KERN_INFO "p54: rx_mtu reduced from %d "
+                                                "to %d\n", priv->rx_mtu,
+                                                maxlen);
+                               priv->rx_mtu = maxlen;
+                       }
                        break;
                        }
                case BR_CODE_EXPOSED_IF: