By caching frag0_len, we can avoid checking both frag0 and the
length separately in skb_gro_header.  This helps as skb_gro_header
is called four times per packet which amounts to a few million
times at 10Gb/s.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
        /* Virtual address of skb_shinfo(skb)->frags[0].page + offset. */
        void *frag0;
 
+       /* Length of frag0. */
+       unsigned int frag0_len;
+
        /* This indicates where we are processing relative to skb->data. */
        int data_offset;
 
        unsigned int offset = skb_gro_offset(skb);
 
        hlen += offset;
-       if (!NAPI_GRO_CB(skb)->frag0 ||
-           unlikely(skb_shinfo(skb)->frags[0].size < hlen)) {
+       if (NAPI_GRO_CB(skb)->frag0_len < hlen) {
                NAPI_GRO_CB(skb)->frag0 = NULL;
+               NAPI_GRO_CB(skb)->frag0_len = 0;
                return pskb_may_pull(skb, hlen) ? skb->data + offset : NULL;
        }
 
 
 {
        NAPI_GRO_CB(skb)->data_offset = 0;
        NAPI_GRO_CB(skb)->frag0 = NULL;
+       NAPI_GRO_CB(skb)->frag0_len = 0;
 
        if (skb->mac_header == skb->tail &&
-           !PageHighMem(skb_shinfo(skb)->frags[0].page))
+           !PageHighMem(skb_shinfo(skb)->frags[0].page)) {
                NAPI_GRO_CB(skb)->frag0 =
                        page_address(skb_shinfo(skb)->frags[0].page) +
                        skb_shinfo(skb)->frags[0].page_offset;
+               NAPI_GRO_CB(skb)->frag0_len = skb_shinfo(skb)->frags[0].size;
+       }
 }
 EXPORT_SYMBOL(skb_gro_reset_offset);