diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2009-05-26 14:50:27 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-05-27 06:26:01 -0400 |
commit | 7489594cb249aeb178287c9a43a9e4f366044259 (patch) | |
tree | 3989b000550aa061d6cd222a83c12c62c1cc0182 /net/core/dev.c | |
parent | 30a3ae30c775e2723f86ef70746ad3cb4404a4c9 (diff) |
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 'net/core/dev.c')
-rw-r--r-- | net/core/dev.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index f9d90c56b6f0..b1722a2d1fbe 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -2509,12 +2509,15 @@ void skb_gro_reset_offset(struct sk_buff *skb) | |||
2509 | { | 2509 | { |
2510 | NAPI_GRO_CB(skb)->data_offset = 0; | 2510 | NAPI_GRO_CB(skb)->data_offset = 0; |
2511 | NAPI_GRO_CB(skb)->frag0 = NULL; | 2511 | NAPI_GRO_CB(skb)->frag0 = NULL; |
2512 | NAPI_GRO_CB(skb)->frag0_len = 0; | ||
2512 | 2513 | ||
2513 | if (skb->mac_header == skb->tail && | 2514 | if (skb->mac_header == skb->tail && |
2514 | !PageHighMem(skb_shinfo(skb)->frags[0].page)) | 2515 | !PageHighMem(skb_shinfo(skb)->frags[0].page)) { |
2515 | NAPI_GRO_CB(skb)->frag0 = | 2516 | NAPI_GRO_CB(skb)->frag0 = |
2516 | page_address(skb_shinfo(skb)->frags[0].page) + | 2517 | page_address(skb_shinfo(skb)->frags[0].page) + |
2517 | skb_shinfo(skb)->frags[0].page_offset; | 2518 | skb_shinfo(skb)->frags[0].page_offset; |
2519 | NAPI_GRO_CB(skb)->frag0_len = skb_shinfo(skb)->frags[0].size; | ||
2520 | } | ||
2518 | } | 2521 | } |
2519 | EXPORT_SYMBOL(skb_gro_reset_offset); | 2522 | EXPORT_SYMBOL(skb_gro_reset_offset); |
2520 | 2523 | ||