gro: Open-code memcpy in napi_fraginfo_skb
authorHerbert Xu <herbert@gondor.apana.org.au>
Thu, 29 Jan 2009 14:19:52 +0000 (14:19 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 30 Jan 2009 00:33:04 +0000 (16:33 -0800)
This patch optimises napi_fraginfo_skb to only copy the bits
necessary.  We also open-code the memcpy so that the alignment
information is always available to gcc.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/dev.c

index df406dc..ec5be1c 100644 (file)
@@ -2533,6 +2533,8 @@ struct sk_buff *napi_fraginfo_skb(struct napi_struct *napi,
        struct net_device *dev = napi->dev;
        struct sk_buff *skb = napi->skb;
        struct ethhdr *eth;
+       skb_frag_t *frag;
+       int i;
 
        napi->skb = NULL;
 
@@ -2545,8 +2547,14 @@ struct sk_buff *napi_fraginfo_skb(struct napi_struct *napi,
        }
 
        BUG_ON(info->nr_frags > MAX_SKB_FRAGS);
+       frag = &info->frags[info->nr_frags - 1];
+
+       for (i = skb_shinfo(skb)->nr_frags; i < info->nr_frags; i++) {
+               skb_fill_page_desc(skb, i, frag->page, frag->page_offset,
+                                  frag->size);
+               frag++;
+       }
        skb_shinfo(skb)->nr_frags = info->nr_frags;
-       memcpy(skb_shinfo(skb)->frags, info->frags, sizeof(info->frags));
 
        skb->data_len = info->len;
        skb->len += info->len;