diff options
author | Eric Dumazet <eric.dumazet@gmail.com> | 2012-04-10 20:08:39 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-04-11 10:10:43 -0400 |
commit | 87151b8689d890dfb495081f7be9b9e257f7a2df (patch) | |
tree | cb12becc26090b9fd9275f25cee851ffb40d931f /net | |
parent | 996304bbea3d2a094b7ba54c3bd65d3fffeac57b (diff) | |
download | linux-stable-87151b8689d890dfb495081f7be9b9e257f7a2df.tar.gz linux-stable-87151b8689d890dfb495081f7be9b9e257f7a2df.tar.bz2 linux-stable-87151b8689d890dfb495081f7be9b9e257f7a2df.zip |
net: allow pskb_expand_head() to get maximum tailroom
Marc Merlin reported many order-1 allocations failures in TX path on its
wireless setup, that dont make any sense with MTU=1500 network, and non
SG capable hardware.
Turns out part of the problem comes from pskb_expand_head() not using
ksize() to get exact head size given by kmalloc(). Doing the same thing
than __alloc_skb() allows more tailroom in skb and can prevent future
reallocations.
As a bonus, struct skb_shared_info becomes cache line aligned.
Reported-by: Marc MERLIN <marc@merlins.org>
Tested-by: Marc MERLIN <marc@merlins.org>
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/core/skbuff.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index baf8d281152c..e59840010d45 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -952,9 +952,11 @@ int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail, goto adjust_others; } - data = kmalloc(size + sizeof(struct skb_shared_info), gfp_mask); + data = kmalloc(size + SKB_DATA_ALIGN(sizeof(struct skb_shared_info)), + gfp_mask); if (!data) goto nodata; + size = SKB_WITH_OVERHEAD(ksize(data)); /* Copy only real data... and, alas, header. This should be * optimized for the cases when header is void. |