Skip to content

Commit

Permalink
gro: Store shinfo in local variable in skb_gro_receive
Browse files Browse the repository at this point in the history
This patch stores the two shinfo pointers in local variables
because they're used over and over again in skb_gro_receive.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Herbert Xu authored and David S. Miller committed May 27, 2009
1 parent 66e92fc commit 9aaa156
Showing 1 changed file with 12 additions and 10 deletions.
22 changes: 12 additions & 10 deletions net/core/skbuff.c
Original file line number Diff line number Diff line change
Expand Up @@ -2664,6 +2664,8 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb)
{
struct sk_buff *p = *head;
struct sk_buff *nskb;
struct skb_shared_info *skbinfo = skb_shinfo(skb);
struct skb_shared_info *pinfo = skb_shinfo(p);
unsigned int headroom;
unsigned int len = skb_gro_len(skb);
unsigned int offset = skb_gro_offset(skb);
Expand All @@ -2672,24 +2674,24 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb)
if (p->len + len >= 65536)
return -E2BIG;

if (skb_shinfo(p)->frag_list)
if (pinfo->frag_list)
goto merge;
else if (headlen <= offset) {
skb_frag_t *frag;
skb_frag_t *frag2;
int i = skb_shinfo(skb)->nr_frags;
int nr_frags = skb_shinfo(p)->nr_frags + i;
int i = skbinfo->nr_frags;
int nr_frags = pinfo->nr_frags + i;

offset -= headlen;

if (nr_frags > MAX_SKB_FRAGS)
return -E2BIG;

skb_shinfo(p)->nr_frags = nr_frags;
skb_shinfo(skb)->nr_frags = 0;
pinfo->nr_frags = nr_frags;
skbinfo->nr_frags = 0;

frag = skb_shinfo(p)->frags + nr_frags;
frag2 = skb_shinfo(skb)->frags + i;
frag = pinfo->frags + nr_frags;
frag2 = skbinfo->frags + i;
do {
*--frag = *--frag2;
} while (--i);
Expand Down Expand Up @@ -2726,7 +2728,7 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb)

*NAPI_GRO_CB(nskb) = *NAPI_GRO_CB(p);
skb_shinfo(nskb)->frag_list = p;
skb_shinfo(nskb)->gso_size = skb_shinfo(p)->gso_size;
skb_shinfo(nskb)->gso_size = pinfo->gso_size;
skb_header_release(p);
nskb->prev = p;

Expand All @@ -2742,8 +2744,8 @@ int skb_gro_receive(struct sk_buff **head, struct sk_buff *skb)

merge:
if (offset > headlen) {
skb_shinfo(skb)->frags[0].page_offset += offset - headlen;
skb_shinfo(skb)->frags[0].size -= offset - headlen;
skbinfo->frags[0].page_offset += offset - headlen;
skbinfo->frags[0].size -= offset - headlen;
offset = headlen;
}

Expand Down

0 comments on commit 9aaa156

Please sign in to comment.