kernel: align the skb padding to power of two
authorFelix Fietkau <nbd@openwrt.org>
Wed, 11 Sep 2013 14:30:15 +0000 (14:30 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Wed, 11 Sep 2013 14:30:15 +0000 (14:30 +0000)
The skb is usually started by a padding which allows the protocols in the
network stack to add their headers in front of the payload. The skb can be
reallocated in case the preallocated padding is not large enough. This can for
example happen in the function __skb_cow which will check the requested extra
headroom and allocate more buffer when the requested headroom is bigger than
the available one. The extra buffer is aligned again to the multiple of the
NET_SKB_PAD of the target architecture.

The macro used to create the multiple of the NET_SKB_PAD is written in a way
which allows only values power two as alignment parameter. The currently used
value of 48 bytes can not be written as n ** 2 but as 2 ** 4 + 2 ** 5. The
extra buffer is therefore not always the multiple of 48 but can be 16, 64, 80,
128, 144 and so on. The generated values are also not monotonic (48 requested
bytes are mapped to 80 allocated bytes and 49 requested bytes are mapped to 64
allocated bytes).

These unexpected small values result in more reallocations of the buffer. This
was noticed prominently during tests between two QCA9558 720 MHz devices which
were connected via ethernet to PCs and had a HT40 802.11n 3x3 link between each
other. The throughput PC-to-PC during iperf TCP runs increased reliable from
186 Mibit/s to 214 Mibit/s in one direction and from 195 Mibit/s to 220 Mibit/s
in the other direction. This is a performance increase of ~14% just by reducing
the amount of reallocations.

Signed-off-by: Sven Eckelmann <sven@open-mesh.com>
SVN-Revision: 37948

target/linux/generic/patches-3.10/655-increase_skb_pad.patch
target/linux/generic/patches-3.3/655-increase_skb_pad.patch
target/linux/generic/patches-3.6/655-increase_skb_pad.patch
target/linux/generic/patches-3.8/655-increase_skb_pad.patch
target/linux/generic/patches-3.9/655-increase_skb_pad.patch

index b1a0fb71f8dd6219d4377876ed08b6e8b35a7624..6e10a1ace4592863891023410f2ba4deb08c1d95 100644 (file)
@@ -5,7 +5,7 @@
   */
  #ifndef NET_SKB_PAD
 -#define NET_SKB_PAD   max(32, L1_CACHE_BYTES)
-+#define NET_SKB_PAD   max(48, L1_CACHE_BYTES)
++#define NET_SKB_PAD   max(64, L1_CACHE_BYTES)
  #endif
  
  extern int ___pskb_trim(struct sk_buff *skb, unsigned int len);
index 5d14daadfac7fe5c3224d77c8c784de642576023..c4c8c3416e15c82f17b1a119e72e843d53026793 100644 (file)
@@ -5,7 +5,7 @@
   */
  #ifndef NET_SKB_PAD
 -#define NET_SKB_PAD   max(32, L1_CACHE_BYTES)
-+#define NET_SKB_PAD   max(48, L1_CACHE_BYTES)
++#define NET_SKB_PAD   max(64, L1_CACHE_BYTES)
  #endif
  
  extern int ___pskb_trim(struct sk_buff *skb, unsigned int len);
index c67a6a479769d1dca3d8011d459a428b8fe3461b..0f856a6cc03e2aa11e76147c148472e49fa9e392 100644 (file)
@@ -5,7 +5,7 @@
   */
  #ifndef NET_SKB_PAD
 -#define NET_SKB_PAD   max(32, L1_CACHE_BYTES)
-+#define NET_SKB_PAD   max(48, L1_CACHE_BYTES)
++#define NET_SKB_PAD   max(64, L1_CACHE_BYTES)
  #endif
  
  extern int ___pskb_trim(struct sk_buff *skb, unsigned int len);
index 6150d5237d68867ea420ac589289c87c5e423f53..9f0b3dc931c3598053b053bd43c6bf159f4b2fbf 100644 (file)
@@ -5,7 +5,7 @@
   */
  #ifndef NET_SKB_PAD
 -#define NET_SKB_PAD   max(32, L1_CACHE_BYTES)
-+#define NET_SKB_PAD   max(48, L1_CACHE_BYTES)
++#define NET_SKB_PAD   max(64, L1_CACHE_BYTES)
  #endif
  
  extern int ___pskb_trim(struct sk_buff *skb, unsigned int len);
index 6d0d3df8413982eaaf80651cffbf651b656bc813..9f669fa8bd23538b7adf31c837d091d2a7010b26 100644 (file)
@@ -5,7 +5,7 @@
   */
  #ifndef NET_SKB_PAD
 -#define NET_SKB_PAD   max(32, L1_CACHE_BYTES)
-+#define NET_SKB_PAD   max(48, L1_CACHE_BYTES)
++#define NET_SKB_PAD   max(64, L1_CACHE_BYTES)
  #endif
  
  extern int ___pskb_trim(struct sk_buff *skb, unsigned int len);