diff options
Diffstat (limited to 'net/ipv6/tcp_ipv6.c')
| -rw-r--r-- | net/ipv6/tcp_ipv6.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 80643e6b346b..d693cb988b78 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
| @@ -209,9 +209,11 @@ static __inline__ void __tcp_v6_hash(struct sock *sk) | |||
| 209 | lock = &tcp_hashinfo.lhash_lock; | 209 | lock = &tcp_hashinfo.lhash_lock; |
| 210 | inet_listen_wlock(&tcp_hashinfo); | 210 | inet_listen_wlock(&tcp_hashinfo); |
| 211 | } else { | 211 | } else { |
| 212 | sk->sk_hashent = inet6_sk_ehashfn(sk, tcp_hashinfo.ehash_size); | 212 | unsigned int hash; |
| 213 | list = &tcp_hashinfo.ehash[sk->sk_hashent].chain; | 213 | sk->sk_hash = hash = inet6_sk_ehashfn(sk); |
| 214 | lock = &tcp_hashinfo.ehash[sk->sk_hashent].lock; | 214 | hash &= (tcp_hashinfo.ehash_size - 1); |
| 215 | list = &tcp_hashinfo.ehash[hash].chain; | ||
| 216 | lock = &tcp_hashinfo.ehash[hash].lock; | ||
| 215 | write_lock(lock); | 217 | write_lock(lock); |
| 216 | } | 218 | } |
| 217 | 219 | ||
| @@ -322,13 +324,13 @@ static int __tcp_v6_check_established(struct sock *sk, const __u16 lport, | |||
| 322 | const struct in6_addr *saddr = &np->daddr; | 324 | const struct in6_addr *saddr = &np->daddr; |
| 323 | const int dif = sk->sk_bound_dev_if; | 325 | const int dif = sk->sk_bound_dev_if; |
| 324 | const u32 ports = INET_COMBINED_PORTS(inet->dport, lport); | 326 | const u32 ports = INET_COMBINED_PORTS(inet->dport, lport); |
| 325 | const int hash = inet6_ehashfn(daddr, inet->num, saddr, inet->dport, | 327 | unsigned int hash = inet6_ehashfn(daddr, inet->num, saddr, inet->dport); |
| 326 | tcp_hashinfo.ehash_size); | 328 | struct inet_ehash_bucket *head = inet_ehash_bucket(&tcp_hashinfo, hash); |
| 327 | struct inet_ehash_bucket *head = &tcp_hashinfo.ehash[hash]; | ||
| 328 | struct sock *sk2; | 329 | struct sock *sk2; |
| 329 | const struct hlist_node *node; | 330 | const struct hlist_node *node; |
| 330 | struct inet_timewait_sock *tw; | 331 | struct inet_timewait_sock *tw; |
| 331 | 332 | ||
| 333 | prefetch(head->chain.first); | ||
| 332 | write_lock(&head->lock); | 334 | write_lock(&head->lock); |
| 333 | 335 | ||
| 334 | /* Check TIME-WAIT sockets first. */ | 336 | /* Check TIME-WAIT sockets first. */ |
| @@ -365,14 +367,14 @@ static int __tcp_v6_check_established(struct sock *sk, const __u16 lport, | |||
| 365 | 367 | ||
| 366 | /* And established part... */ | 368 | /* And established part... */ |
| 367 | sk_for_each(sk2, node, &head->chain) { | 369 | sk_for_each(sk2, node, &head->chain) { |
| 368 | if (INET6_MATCH(sk2, saddr, daddr, ports, dif)) | 370 | if (INET6_MATCH(sk2, hash, saddr, daddr, ports, dif)) |
| 369 | goto not_unique; | 371 | goto not_unique; |
| 370 | } | 372 | } |
| 371 | 373 | ||
| 372 | unique: | 374 | unique: |
| 373 | BUG_TRAP(sk_unhashed(sk)); | 375 | BUG_TRAP(sk_unhashed(sk)); |
| 374 | __sk_add_node(sk, &head->chain); | 376 | __sk_add_node(sk, &head->chain); |
| 375 | sk->sk_hashent = hash; | 377 | sk->sk_hash = hash; |
| 376 | sock_prot_inc_use(sk->sk_prot); | 378 | sock_prot_inc_use(sk->sk_prot); |
| 377 | write_unlock(&head->lock); | 379 | write_unlock(&head->lock); |
| 378 | 380 | ||
