diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2009-05-26 14:50:28 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-05-27 06:26:01 -0400 |
commit | a5b1cf288d4200506ab62fbb86cc81ace948a306 (patch) | |
tree | c95339866f4d67220d111811a92e5c6b79de6ab4 /net/ipv6/af_inet6.c | |
parent | 7489594cb249aeb178287c9a43a9e4f366044259 (diff) |
gro: Avoid unnecessary comparison after skb_gro_header
For the overwhelming majority of cases, skb_gro_header's return
value cannot be NULL. Yet we must check it because of its current
form. This patch splits it up into multiple functions in order
to avoid this.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/af_inet6.c')
-rw-r--r-- | net/ipv6/af_inet6.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index 61f55386a236..b6215be0963f 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c | |||
@@ -817,13 +817,20 @@ static struct sk_buff **ipv6_gro_receive(struct sk_buff **head, | |||
817 | struct sk_buff *p; | 817 | struct sk_buff *p; |
818 | struct ipv6hdr *iph; | 818 | struct ipv6hdr *iph; |
819 | unsigned int nlen; | 819 | unsigned int nlen; |
820 | unsigned int hlen; | ||
821 | unsigned int off; | ||
820 | int flush = 1; | 822 | int flush = 1; |
821 | int proto; | 823 | int proto; |
822 | __wsum csum; | 824 | __wsum csum; |
823 | 825 | ||
824 | iph = skb_gro_header(skb, sizeof(*iph)); | 826 | off = skb_gro_offset(skb); |
825 | if (unlikely(!iph)) | 827 | hlen = off + sizeof(*iph); |
826 | goto out; | 828 | iph = skb_gro_header_fast(skb, off); |
829 | if (skb_gro_header_hard(skb, hlen)) { | ||
830 | iph = skb_gro_header_slow(skb, hlen, off); | ||
831 | if (unlikely(!iph)) | ||
832 | goto out; | ||
833 | } | ||
827 | 834 | ||
828 | skb_gro_pull(skb, sizeof(*iph)); | 835 | skb_gro_pull(skb, sizeof(*iph)); |
829 | skb_set_transport_header(skb, skb_gro_offset(skb)); | 836 | skb_set_transport_header(skb, skb_gro_offset(skb)); |