summaryrefslogtreecommitdiff
path: root/include/linux/netdevice.h
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2009-05-26 18:50:27 +0000
committerDavid S. Miller <davem@davemloft.net>2009-05-27 03:26:01 -0700
commit7489594cb249aeb178287c9a43a9e4f366044259 (patch)
tree3989b000550aa061d6cd222a83c12c62c1cc0182 /include/linux/netdevice.h
parent30a3ae30c775e2723f86ef70746ad3cb4404a4c9 (diff)
downloadlwn-7489594cb249aeb178287c9a43a9e4f366044259.tar.gz
lwn-7489594cb249aeb178287c9a43a9e4f366044259.zip
gro: Optimise length comparison in skb_gro_header
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>
Diffstat (limited to 'include/linux/netdevice.h')
-rw-r--r--include/linux/netdevice.h7
1 files changed, 5 insertions, 2 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index d1afc3b64854..2e44a049be0f 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -1011,6 +1011,9 @@ struct napi_gro_cb {
/* 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;
@@ -1134,9 +1137,9 @@ static inline void *skb_gro_header(struct sk_buff *skb, unsigned int hlen)
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;
}