[NET]: Avoid allocating skb in skb_pad
authorHerbert Xu <herbert@gondor.apana.org.au>
Fri, 23 Jun 2006 09:06:41 +0000 (02:06 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 23 Jun 2006 09:06:41 +0000 (02:06 -0700)
commit5b057c6b1a25d57edf2b4d1e956e50936480a9ff
treee641febd6f562e0ed1198c160ff353ab513f0612
parent5fa21d821f6972e70942f2c555ec29dde962bdb2
[NET]: Avoid allocating skb in skb_pad

First of all it is unnecessary to allocate a new skb in skb_pad since
the existing one is not shared.  More importantly, our hard_start_xmit
interface does not allow a new skb to be allocated since that breaks
requeueing.

This patch uses pskb_expand_head to expand the existing skb and linearize
it if needed.  Actually, someone should sift through every instance of
skb_pad on a non-linear skb as they do not fit the reasons why this was
originally created.

Incidentally, this fixes a minor bug when the skb is cloned (tcpdump,
TCP, etc.).  As it is skb_pad will simply write over a cloned skb.  Because
of the position of the write it is unlikely to cause problems but still
it's best if we don't do it.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
36 files changed:
drivers/net/3c527.c
drivers/net/82596.c
drivers/net/a2065.c
drivers/net/ariadne.c
drivers/net/arm/ether1.c
drivers/net/arm/ether3.c
drivers/net/atarilance.c
drivers/net/cassini.c
drivers/net/declance.c
drivers/net/depca.c
drivers/net/eepro.c
drivers/net/eexpress.c
drivers/net/epic100.c
drivers/net/eth16i.c
drivers/net/hp100.c
drivers/net/lance.c
drivers/net/lasi_82596.c
drivers/net/lp486e.c
drivers/net/myri10ge/myri10ge.c
drivers/net/pcmcia/fmvj18x_cs.c
drivers/net/pcmcia/xirc2ps_cs.c
drivers/net/r8169.c
drivers/net/seeq8005.c
drivers/net/sis190.c
drivers/net/sk98lin/skge.c
drivers/net/skge.c
drivers/net/smc9194.c
drivers/net/sonic.c
drivers/net/starfire.c
drivers/net/via-rhine.c
drivers/net/wireless/ray_cs.c
drivers/net/wireless/wavelan_cs.c
drivers/net/yellowfin.c
drivers/net/znet.c
include/linux/skbuff.h
net/core/skbuff.c