Eric Dumazet 3d3be4333f gro: fix different skb headrooms
Packets entering GRO might have different headrooms, even for a given
flow (because of implementation details in drivers, like copybreak).
We cant force drivers to deliver packets with a fixed headroom.

1) fix skb_segment()

skb_segment() makes the false assumption headrooms of fragments are same
than the head. When CHECKSUM_PARTIAL is used, this can give csum_start
errors, and crash later in skb_copy_and_csum_dev()

2) allocate a minimal skb for head of frag_list

skb_gro_receive() uses netdev_alloc_skb(headroom + skb_gro_offset(p)) to
allocate a fresh skb. This adds NET_SKB_PAD to a padding already
provided by netdevice, depending on various things, like copybreak.

Use alloc_skb() to allocate an exact padding, to reduce cache line
needs:
NET_SKB_PAD + NET_IP_ALIGN

bugzilla : https://bugzilla.kernel.org/show_bug.cgi?id=16626

Many thanks to Plamen Petrov, testing many debugging patches !
With help of Jarek Poplawski.

Reported-by: Plamen Petrov <pvp-lsts@fs.uni-ruse.bg>
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
CC: Jarek Poplawski <jarkao2@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2010-09-01 19:17:35 -07:00
..
2010-08-02 14:28:36 -05:00
2010-08-04 21:53:17 -07:00
2010-08-26 15:18:27 -07:00
2010-09-01 19:17:35 -07:00
2010-07-18 15:07:14 -07:00
2010-06-11 18:37:08 -07:00
2010-08-23 14:41:22 -07:00
2010-06-03 03:21:52 -07:00
2010-05-17 23:23:13 -07:00
2010-08-30 16:02:34 -04:00
2010-04-20 16:37:13 -07:00
2010-08-18 23:40:03 -07:00
2010-08-01 00:32:12 -07:00
2010-05-17 17:39:28 -07:00