net: NET_SKB_PAD should depend on L1_CACHE_BYTES
authorEric Dumazet <eric.dumazet@gmail.com>
Wed, 16 Jun 2010 01:16:43 +0000 (18:16 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 16 Jun 2010 01:16:43 +0000 (18:16 -0700)
In old kernels, NET_SKB_PAD was defined to 16.

Then commit d6301d3dd1c2 (net: Increase default NET_SKB_PAD to 32), and
commit 18e8c134f4e9 (net: Increase NET_SKB_PAD to 64 bytes) increased it
to 64.

While first patch was governed by network stack needs, second was more
driven by performance issues on current hardware. Real intent was to
align data on a cache line boundary.

So use max(32, L1_CACHE_BYTES) instead of 64, to be more generic.

Remove microblaze and powerpc own NET_SKB_PAD definitions.

Thanks to Alexander Duyck and David Miller for their comments.

Suggested-by: David Miller <davem@davemloft.net>
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
arch/microblaze/include/asm/system.h
arch/powerpc/include/asm/system.h
include/linux/skbuff.h

index 48c4f0335e3f51b74413a93783da6f1fb8f0970d..81e1f7d5b4cbd50e683d0824daf6ccf569d1bcf0 100644 (file)
@@ -101,10 +101,7 @@ extern struct dentry *of_debugfs_root;
  * MicroBlaze doesn't handle unaligned accesses in hardware.
  *
  * Based on this we force the IP header alignment in network drivers.
  * MicroBlaze doesn't handle unaligned accesses in hardware.
  *
  * Based on this we force the IP header alignment in network drivers.
- * We also modify NET_SKB_PAD to be a cacheline in size, thus maintaining
- * cacheline alignment of buffers.
  */
 #define NET_IP_ALIGN   2
  */
 #define NET_IP_ALIGN   2
-#define NET_SKB_PAD    L1_CACHE_BYTES
 
 #endif /* _ASM_MICROBLAZE_SYSTEM_H */
 
 #endif /* _ASM_MICROBLAZE_SYSTEM_H */
index a6297c67c3d6ab4e0e4a81246342dbf282dedb27..6c294acac848145d868d9f936c5df5ca879b1920 100644 (file)
@@ -515,11 +515,8 @@ __cmpxchg_local(volatile void *ptr, unsigned long old, unsigned long new,
  * powers of 2 writes until it reaches sufficient alignment).
  *
  * Based on this we disable the IP header alignment in network drivers.
  * powers of 2 writes until it reaches sufficient alignment).
  *
  * Based on this we disable the IP header alignment in network drivers.
- * We also modify NET_SKB_PAD to be a cacheline in size, thus maintaining
- * cacheline alignment of buffers.
  */
 #define NET_IP_ALIGN   0
  */
 #define NET_IP_ALIGN   0
-#define NET_SKB_PAD    L1_CACHE_BYTES
 
 #define cmpxchg64(ptr, o, n)                                           \
   ({                                                                   \
 
 #define cmpxchg64(ptr, o, n)                                           \
   ({                                                                   \
index 122d08396e566e63e9dd77da5ab7144b2558cb70..ac74ee085d743139faddc1f36958a99c0f7f6a05 100644 (file)
@@ -1414,12 +1414,14 @@ static inline int skb_network_offset(const struct sk_buff *skb)
  *
  * Various parts of the networking layer expect at least 32 bytes of
  * headroom, you should not reduce this.
  *
  * Various parts of the networking layer expect at least 32 bytes of
  * headroom, you should not reduce this.
- * With RPS, we raised NET_SKB_PAD to 64 so that get_rps_cpus() fetches span
- * a 64 bytes aligned block to fit modern (>= 64 bytes) cache line sizes
+ *
+ * Using max(32, L1_CACHE_BYTES) makes sense (especially with RPS)
+ * to reduce average number of cache lines per packet.
+ * get_rps_cpus() for example only access one 64 bytes aligned block :
  * NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8)
  */
 #ifndef NET_SKB_PAD
  * NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8)
  */
 #ifndef NET_SKB_PAD
-#define NET_SKB_PAD    64
+#define NET_SKB_PAD    max(32, L1_CACHE_BYTES)
 #endif
 
 extern int ___pskb_trim(struct sk_buff *skb, unsigned int len);
 #endif
 
 extern int ___pskb_trim(struct sk_buff *skb, unsigned int len);