]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/ipv6/reassembly.c
[INET]: Omit double hash calculations in xxx_frag_intern
[karo-tx-linux.git] / net / ipv6 / reassembly.c
index 6ad19cfc2025bca20618a81d7bb45495f7291ab1..0a1bf43bd489e8fca1ffe91f8698a7b0ddff68c3 100644 (file)
@@ -233,16 +233,15 @@ out:
 /* Creation primitives. */
 
 
-static struct frag_queue *ip6_frag_intern(struct frag_queue *fq_in)
+static struct frag_queue *ip6_frag_intern(struct frag_queue *fq_in,
+               unsigned int hash)
 {
        struct frag_queue *fq;
-       unsigned int hash;
 #ifdef CONFIG_SMP
        struct hlist_node *n;
 #endif
 
        write_lock(&ip6_frags.lock);
-       hash = ip6qhashfn(fq_in->id, &fq_in->saddr, &fq_in->daddr);
 #ifdef CONFIG_SMP
        hlist_for_each_entry(fq, n, &ip6_frags.hash[hash], q.list) {
                if (fq->id == fq_in->id &&
@@ -273,7 +272,7 @@ static struct frag_queue *ip6_frag_intern(struct frag_queue *fq_in)
 
 static struct frag_queue *
 ip6_frag_create(__be32 id, struct in6_addr *src, struct in6_addr *dst,
-               struct inet6_dev *idev)
+               struct inet6_dev *idev, unsigned int hash)
 {
        struct frag_queue *fq;
 
@@ -290,7 +289,7 @@ ip6_frag_create(__be32 id, struct in6_addr *src, struct in6_addr *dst,
        spin_lock_init(&fq->q.lock);
        atomic_set(&fq->q.refcnt, 1);
 
-       return ip6_frag_intern(fq);
+       return ip6_frag_intern(fq, hash);
 
 oom:
        IP6_INC_STATS_BH(idev, IPSTATS_MIB_REASMFAILS);
@@ -318,7 +317,7 @@ fq_find(__be32 id, struct in6_addr *src, struct in6_addr *dst,
        }
        read_unlock(&ip6_frags.lock);
 
-       return ip6_frag_create(id, src, dst, idev);
+       return ip6_frag_create(id, src, dst, idev, hash);
 }