Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=65c88466602c61b639f75623e5ba72c1534df9bd
Commit:     65c88466602c61b639f75623e5ba72c1534df9bd
Parent:     f61944efdf0d2569721ed6d7b0445e9f1214b295
Author:     Herbert Xu <[EMAIL PROTECTED]>
AuthorDate: Mon Oct 15 01:29:10 2007 -0700
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Mon Oct 15 12:26:31 2007 -0700

    [IPV6]: Avoid skb_copy/pskb_copy/skb_realloc_headroom on input
    
    This patch replaces unnecessary uses of skb_copy by pskb_expand_head
    on the IPv6 input path.
    
    This allows us to remove the double pointers later.
    
    Signed-off-by: Herbert Xu <[EMAIL PROTECTED]>
    Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
---
 net/ipv6/exthdrs.c |   23 +++++------------------
 1 files changed, 5 insertions(+), 18 deletions(-)

diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c
index c82d4d4..0ff2bf1 100644
--- a/net/ipv6/exthdrs.c
+++ b/net/ipv6/exthdrs.c
@@ -234,22 +234,13 @@ static int ipv6_dest_hao(struct sk_buff **skbp, int 
optoff)
                goto discard;
 
        if (skb_cloned(skb)) {
-               struct sk_buff *skb2 = skb_copy(skb, GFP_ATOMIC);
-               struct inet6_skb_parm *opt2;
-
-               if (skb2 == NULL)
+               if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC))
                        goto discard;
 
-               opt2 = IP6CB(skb2);
-               memcpy(opt2, opt, sizeof(*opt2));
-
-               kfree_skb(skb);
-
                /* update all variable using below by copied skbuff */
-               *skbp = skb = skb2;
-               hao = (struct ipv6_destopt_hao *)(skb_network_header(skb2) +
+               hao = (struct ipv6_destopt_hao *)(skb_network_header(skb) +
                                                  optoff);
-               ipv6h = ipv6_hdr(skb2);
+               ipv6h = ipv6_hdr(skb);
        }
 
        if (skb->ip_summed == CHECKSUM_COMPLETE)
@@ -464,18 +455,14 @@ looped_back:
           Do not damage packets queued somewhere.
         */
        if (skb_cloned(skb)) {
-               struct sk_buff *skb2 = skb_copy(skb, GFP_ATOMIC);
                /* the copy is a forwarded packet */
-               if (skb2 == NULL) {
+               if (pskb_expand_head(skb, 0, 0, GFP_ATOMIC)) {
                        IP6_INC_STATS_BH(ip6_dst_idev(skb->dst),
                                         IPSTATS_MIB_OUTDISCARDS);
                        kfree_skb(skb);
                        return -1;
                }
-               kfree_skb(skb);
-               *skbp = skb = skb2;
-               opt = IP6CB(skb2);
-               hdr = (struct ipv6_rt_hdr *)skb_transport_header(skb2);
+               hdr = (struct ipv6_rt_hdr *)skb_transport_header(skb);
        }
 
        if (skb->ip_summed == CHECKSUM_COMPLETE)
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to