aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/ip_fragment.c
diff options
context:
space:
mode:
authorPavel Emelyanov <xemul@openvz.org>2007-10-17 22:43:37 -0400
committerDavid S. Miller <davem@davemloft.net>2007-10-17 22:43:37 -0400
commitfd9e63544cac30a34c951f0ec958038f0529e244 (patch)
treeab50911ec813780ee1e472089f4b02a3be6a69e6 /net/ipv4/ip_fragment.c
parentbe07664599fa94d0b85c3e0f525aee2432d15fbf (diff)
[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>
Diffstat (limited to 'net/ipv4/ip_fragment.c')
-rw-r--r--net/ipv4/ip_fragment.c11
1 files changed, 4 insertions, 7 deletions
diff --git a/net/ipv4/ip_fragment.c b/net/ipv4/ip_fragment.c
index 443b3f89192f..d12a18b8f568 100644
--- a/net/ipv4/ip_fragment.c
+++ b/net/ipv4/ip_fragment.c
@@ -212,17 +212,14 @@ out:
212 212
213/* Creation primitives. */ 213/* Creation primitives. */
214 214
215static struct ipq *ip_frag_intern(struct ipq *qp_in) 215static struct ipq *ip_frag_intern(struct ipq *qp_in, unsigned int hash)
216{ 216{
217 struct ipq *qp; 217 struct ipq *qp;
218#ifdef CONFIG_SMP 218#ifdef CONFIG_SMP
219 struct hlist_node *n; 219 struct hlist_node *n;
220#endif 220#endif
221 unsigned int hash;
222 221
223 write_lock(&ip4_frags.lock); 222 write_lock(&ip4_frags.lock);
224 hash = ipqhashfn(qp_in->id, qp_in->saddr, qp_in->daddr,
225 qp_in->protocol);
226#ifdef CONFIG_SMP 223#ifdef CONFIG_SMP
227 /* With SMP race we have to recheck hash table, because 224 /* With SMP race we have to recheck hash table, because
228 * such entry could be created on other cpu, while we 225 * such entry could be created on other cpu, while we
@@ -257,7 +254,7 @@ static struct ipq *ip_frag_intern(struct ipq *qp_in)
257} 254}
258 255
259/* Add an entry to the 'ipq' queue for a newly received IP datagram. */ 256/* Add an entry to the 'ipq' queue for a newly received IP datagram. */
260static struct ipq *ip_frag_create(struct iphdr *iph, u32 user) 257static struct ipq *ip_frag_create(struct iphdr *iph, u32 user, unsigned int h)
261{ 258{
262 struct ipq *qp; 259 struct ipq *qp;
263 260
@@ -278,7 +275,7 @@ static struct ipq *ip_frag_create(struct iphdr *iph, u32 user)
278 spin_lock_init(&qp->q.lock); 275 spin_lock_init(&qp->q.lock);
279 atomic_set(&qp->q.refcnt, 1); 276 atomic_set(&qp->q.refcnt, 1);
280 277
281 return ip_frag_intern(qp); 278 return ip_frag_intern(qp, h);
282 279
283out_nomem: 280out_nomem:
284 LIMIT_NETDEBUG(KERN_ERR "ip_frag_create: no memory left !\n"); 281 LIMIT_NETDEBUG(KERN_ERR "ip_frag_create: no memory left !\n");
@@ -313,7 +310,7 @@ static inline struct ipq *ip_find(struct iphdr *iph, u32 user)
313 } 310 }
314 read_unlock(&ip4_frags.lock); 311 read_unlock(&ip4_frags.lock);
315 312
316 return ip_frag_create(iph, user); 313 return ip_frag_create(iph, user, hash);
317} 314}
318 315
319/* Is the fragment too far ahead to be part of ipq? */ 316/* Is the fragment too far ahead to be part of ipq? */