[INET]: Omit double hash calculations in xxx_frag_intern

Since the hash value is already calculated in xxx_find, we can 
simply use it later. This is already done in netfilter code, 
so make the same in ipv4 and ipv6.

Signed-off-by: Pavel Emelyanov <xemul@openvz.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Pavel Emelyanov 2007-10-17 19:43:37 -07:00 committed by David S. Miller
parent be07664599
commit fd9e63544c
2 changed files with 9 additions and 13 deletions

View 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);
}