diff options
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
-rw-r--r-- | net/ipv4/tcp_ipv4.c | 101 |
1 files changed, 50 insertions, 51 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 40fe4f5fca1c..f5373f9f00ac 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -94,6 +94,7 @@ struct inet_hashinfo __cacheline_aligned tcp_hashinfo = { | |||
94 | .lhash_users = ATOMIC_INIT(0), | 94 | .lhash_users = ATOMIC_INIT(0), |
95 | .lhash_wait = __WAIT_QUEUE_HEAD_INITIALIZER(tcp_hashinfo.lhash_wait), | 95 | .lhash_wait = __WAIT_QUEUE_HEAD_INITIALIZER(tcp_hashinfo.lhash_wait), |
96 | .portalloc_lock = SPIN_LOCK_UNLOCKED, | 96 | .portalloc_lock = SPIN_LOCK_UNLOCKED, |
97 | .port_rover = 1024 - 1, | ||
97 | }; | 98 | }; |
98 | 99 | ||
99 | /* | 100 | /* |
@@ -102,7 +103,6 @@ struct inet_hashinfo __cacheline_aligned tcp_hashinfo = { | |||
102 | * 32768-61000 | 103 | * 32768-61000 |
103 | */ | 104 | */ |
104 | int sysctl_local_port_range[2] = { 1024, 4999 }; | 105 | int sysctl_local_port_range[2] = { 1024, 4999 }; |
105 | int tcp_port_rover = 1024 - 1; | ||
106 | 106 | ||
107 | static inline int tcp_bind_conflict(struct sock *sk, struct inet_bind_bucket *tb) | 107 | static inline int tcp_bind_conflict(struct sock *sk, struct inet_bind_bucket *tb) |
108 | { | 108 | { |
@@ -146,16 +146,16 @@ static int tcp_v4_get_port(struct sock *sk, unsigned short snum) | |||
146 | int remaining = (high - low) + 1; | 146 | int remaining = (high - low) + 1; |
147 | int rover; | 147 | int rover; |
148 | 148 | ||
149 | spin_lock(&tcp_portalloc_lock); | 149 | spin_lock(&tcp_hashinfo.portalloc_lock); |
150 | if (tcp_port_rover < low) | 150 | if (tcp_hashinfo.port_rover < low) |
151 | rover = low; | 151 | rover = low; |
152 | else | 152 | else |
153 | rover = tcp_port_rover; | 153 | rover = tcp_hashinfo.port_rover; |
154 | do { | 154 | do { |
155 | rover++; | 155 | rover++; |
156 | if (rover > high) | 156 | if (rover > high) |
157 | rover = low; | 157 | rover = low; |
158 | head = &tcp_bhash[inet_bhashfn(rover, tcp_bhash_size)]; | 158 | head = &tcp_hashinfo.bhash[inet_bhashfn(rover, tcp_hashinfo.bhash_size)]; |
159 | spin_lock(&head->lock); | 159 | spin_lock(&head->lock); |
160 | inet_bind_bucket_for_each(tb, node, &head->chain) | 160 | inet_bind_bucket_for_each(tb, node, &head->chain) |
161 | if (tb->port == rover) | 161 | if (tb->port == rover) |
@@ -164,8 +164,8 @@ static int tcp_v4_get_port(struct sock *sk, unsigned short snum) | |||
164 | next: | 164 | next: |
165 | spin_unlock(&head->lock); | 165 | spin_unlock(&head->lock); |
166 | } while (--remaining > 0); | 166 | } while (--remaining > 0); |
167 | tcp_port_rover = rover; | 167 | tcp_hashinfo.port_rover = rover; |
168 | spin_unlock(&tcp_portalloc_lock); | 168 | spin_unlock(&tcp_hashinfo.portalloc_lock); |
169 | 169 | ||
170 | /* Exhausted local port range during search? It is not | 170 | /* Exhausted local port range during search? It is not |
171 | * possible for us to be holding one of the bind hash | 171 | * possible for us to be holding one of the bind hash |
@@ -182,7 +182,7 @@ static int tcp_v4_get_port(struct sock *sk, unsigned short snum) | |||
182 | */ | 182 | */ |
183 | snum = rover; | 183 | snum = rover; |
184 | } else { | 184 | } else { |
185 | head = &tcp_bhash[inet_bhashfn(snum, tcp_bhash_size)]; | 185 | head = &tcp_hashinfo.bhash[inet_bhashfn(snum, tcp_hashinfo.bhash_size)]; |
186 | spin_lock(&head->lock); | 186 | spin_lock(&head->lock); |
187 | inet_bind_bucket_for_each(tb, node, &head->chain) | 187 | inet_bind_bucket_for_each(tb, node, &head->chain) |
188 | if (tb->port == snum) | 188 | if (tb->port == snum) |
@@ -205,7 +205,7 @@ tb_found: | |||
205 | } | 205 | } |
206 | tb_not_found: | 206 | tb_not_found: |
207 | ret = 1; | 207 | ret = 1; |
208 | if (!tb && (tb = inet_bind_bucket_create(tcp_bucket_cachep, head, snum)) == NULL) | 208 | if (!tb && (tb = inet_bind_bucket_create(tcp_hashinfo.bind_bucket_cachep, head, snum)) == NULL) |
209 | goto fail_unlock; | 209 | goto fail_unlock; |
210 | if (hlist_empty(&tb->owners)) { | 210 | if (hlist_empty(&tb->owners)) { |
211 | if (sk->sk_reuse && sk->sk_state != TCP_LISTEN) | 211 | if (sk->sk_reuse && sk->sk_state != TCP_LISTEN) |
@@ -237,22 +237,22 @@ fail: | |||
237 | 237 | ||
238 | void tcp_listen_wlock(void) | 238 | void tcp_listen_wlock(void) |
239 | { | 239 | { |
240 | write_lock(&tcp_lhash_lock); | 240 | write_lock(&tcp_hashinfo.lhash_lock); |
241 | 241 | ||
242 | if (atomic_read(&tcp_lhash_users)) { | 242 | if (atomic_read(&tcp_hashinfo.lhash_users)) { |
243 | DEFINE_WAIT(wait); | 243 | DEFINE_WAIT(wait); |
244 | 244 | ||
245 | for (;;) { | 245 | for (;;) { |
246 | prepare_to_wait_exclusive(&tcp_lhash_wait, | 246 | prepare_to_wait_exclusive(&tcp_hashinfo.lhash_wait, |
247 | &wait, TASK_UNINTERRUPTIBLE); | 247 | &wait, TASK_UNINTERRUPTIBLE); |
248 | if (!atomic_read(&tcp_lhash_users)) | 248 | if (!atomic_read(&tcp_hashinfo.lhash_users)) |
249 | break; | 249 | break; |
250 | write_unlock_bh(&tcp_lhash_lock); | 250 | write_unlock_bh(&tcp_hashinfo.lhash_lock); |
251 | schedule(); | 251 | schedule(); |
252 | write_lock_bh(&tcp_lhash_lock); | 252 | write_lock_bh(&tcp_hashinfo.lhash_lock); |
253 | } | 253 | } |
254 | 254 | ||
255 | finish_wait(&tcp_lhash_wait, &wait); | 255 | finish_wait(&tcp_hashinfo.lhash_wait, &wait); |
256 | } | 256 | } |
257 | } | 257 | } |
258 | 258 | ||
@@ -263,20 +263,20 @@ static __inline__ void __tcp_v4_hash(struct sock *sk, const int listen_possible) | |||
263 | 263 | ||
264 | BUG_TRAP(sk_unhashed(sk)); | 264 | BUG_TRAP(sk_unhashed(sk)); |
265 | if (listen_possible && sk->sk_state == TCP_LISTEN) { | 265 | if (listen_possible && sk->sk_state == TCP_LISTEN) { |
266 | list = &tcp_listening_hash[inet_sk_listen_hashfn(sk)]; | 266 | list = &tcp_hashinfo.listening_hash[inet_sk_listen_hashfn(sk)]; |
267 | lock = &tcp_lhash_lock; | 267 | lock = &tcp_hashinfo.lhash_lock; |
268 | tcp_listen_wlock(); | 268 | tcp_listen_wlock(); |
269 | } else { | 269 | } else { |
270 | sk->sk_hashent = inet_sk_ehashfn(sk, tcp_ehash_size); | 270 | sk->sk_hashent = inet_sk_ehashfn(sk, tcp_hashinfo.ehash_size); |
271 | list = &tcp_ehash[sk->sk_hashent].chain; | 271 | list = &tcp_hashinfo.ehash[sk->sk_hashent].chain; |
272 | lock = &tcp_ehash[sk->sk_hashent].lock; | 272 | lock = &tcp_hashinfo.ehash[sk->sk_hashent].lock; |
273 | write_lock(lock); | 273 | write_lock(lock); |
274 | } | 274 | } |
275 | __sk_add_node(sk, list); | 275 | __sk_add_node(sk, list); |
276 | sock_prot_inc_use(sk->sk_prot); | 276 | sock_prot_inc_use(sk->sk_prot); |
277 | write_unlock(lock); | 277 | write_unlock(lock); |
278 | if (listen_possible && sk->sk_state == TCP_LISTEN) | 278 | if (listen_possible && sk->sk_state == TCP_LISTEN) |
279 | wake_up(&tcp_lhash_wait); | 279 | wake_up(&tcp_hashinfo.lhash_wait); |
280 | } | 280 | } |
281 | 281 | ||
282 | static void tcp_v4_hash(struct sock *sk) | 282 | static void tcp_v4_hash(struct sock *sk) |
@@ -298,9 +298,9 @@ void tcp_unhash(struct sock *sk) | |||
298 | if (sk->sk_state == TCP_LISTEN) { | 298 | if (sk->sk_state == TCP_LISTEN) { |
299 | local_bh_disable(); | 299 | local_bh_disable(); |
300 | tcp_listen_wlock(); | 300 | tcp_listen_wlock(); |
301 | lock = &tcp_lhash_lock; | 301 | lock = &tcp_hashinfo.lhash_lock; |
302 | } else { | 302 | } else { |
303 | struct inet_ehash_bucket *head = &tcp_ehash[sk->sk_hashent]; | 303 | struct inet_ehash_bucket *head = &tcp_hashinfo.ehash[sk->sk_hashent]; |
304 | lock = &head->lock; | 304 | lock = &head->lock; |
305 | write_lock_bh(&head->lock); | 305 | write_lock_bh(&head->lock); |
306 | } | 306 | } |
@@ -311,7 +311,7 @@ void tcp_unhash(struct sock *sk) | |||
311 | 311 | ||
312 | ende: | 312 | ende: |
313 | if (sk->sk_state == TCP_LISTEN) | 313 | if (sk->sk_state == TCP_LISTEN) |
314 | wake_up(&tcp_lhash_wait); | 314 | wake_up(&tcp_hashinfo.lhash_wait); |
315 | } | 315 | } |
316 | 316 | ||
317 | /* Don't inline this cruft. Here are some nice properties to | 317 | /* Don't inline this cruft. Here are some nice properties to |
@@ -366,8 +366,8 @@ static inline struct sock *tcp_v4_lookup_listener(const u32 daddr, | |||
366 | struct sock *sk = NULL; | 366 | struct sock *sk = NULL; |
367 | struct hlist_head *head; | 367 | struct hlist_head *head; |
368 | 368 | ||
369 | read_lock(&tcp_lhash_lock); | 369 | read_lock(&tcp_hashinfo.lhash_lock); |
370 | head = &tcp_listening_hash[inet_lhashfn(hnum)]; | 370 | head = &tcp_hashinfo.listening_hash[inet_lhashfn(hnum)]; |
371 | if (!hlist_empty(head)) { | 371 | if (!hlist_empty(head)) { |
372 | struct inet_sock *inet = inet_sk((sk = __sk_head(head))); | 372 | struct inet_sock *inet = inet_sk((sk = __sk_head(head))); |
373 | 373 | ||
@@ -382,7 +382,7 @@ static inline struct sock *tcp_v4_lookup_listener(const u32 daddr, | |||
382 | sherry_cache: | 382 | sherry_cache: |
383 | sock_hold(sk); | 383 | sock_hold(sk); |
384 | } | 384 | } |
385 | read_unlock(&tcp_lhash_lock); | 385 | read_unlock(&tcp_hashinfo.lhash_lock); |
386 | return sk; | 386 | return sk; |
387 | } | 387 | } |
388 | 388 | ||
@@ -406,8 +406,8 @@ static inline struct sock *__tcp_v4_lookup_established(const u32 saddr, | |||
406 | /* Optimize here for direct hit, only listening connections can | 406 | /* Optimize here for direct hit, only listening connections can |
407 | * have wildcards anyways. | 407 | * have wildcards anyways. |
408 | */ | 408 | */ |
409 | const int hash = inet_ehashfn(daddr, hnum, saddr, sport, tcp_ehash_size); | 409 | const int hash = inet_ehashfn(daddr, hnum, saddr, sport, tcp_hashinfo.ehash_size); |
410 | head = &tcp_ehash[hash]; | 410 | head = &tcp_hashinfo.ehash[hash]; |
411 | read_lock(&head->lock); | 411 | read_lock(&head->lock); |
412 | sk_for_each(sk, node, &head->chain) { | 412 | sk_for_each(sk, node, &head->chain) { |
413 | if (TCP_IPV4_MATCH(sk, acookie, saddr, daddr, ports, dif)) | 413 | if (TCP_IPV4_MATCH(sk, acookie, saddr, daddr, ports, dif)) |
@@ -415,7 +415,7 @@ static inline struct sock *__tcp_v4_lookup_established(const u32 saddr, | |||
415 | } | 415 | } |
416 | 416 | ||
417 | /* Must check for a TIME_WAIT'er before going to listener hash. */ | 417 | /* Must check for a TIME_WAIT'er before going to listener hash. */ |
418 | sk_for_each(sk, node, &(head + tcp_ehash_size)->chain) { | 418 | sk_for_each(sk, node, &(head + tcp_hashinfo.ehash_size)->chain) { |
419 | if (TCP_IPV4_TW_MATCH(sk, acookie, saddr, daddr, ports, dif)) | 419 | if (TCP_IPV4_TW_MATCH(sk, acookie, saddr, daddr, ports, dif)) |
420 | goto hit; | 420 | goto hit; |
421 | } | 421 | } |
@@ -469,8 +469,8 @@ static int __tcp_v4_check_established(struct sock *sk, __u16 lport, | |||
469 | int dif = sk->sk_bound_dev_if; | 469 | int dif = sk->sk_bound_dev_if; |
470 | TCP_V4_ADDR_COOKIE(acookie, saddr, daddr) | 470 | TCP_V4_ADDR_COOKIE(acookie, saddr, daddr) |
471 | __u32 ports = TCP_COMBINED_PORTS(inet->dport, lport); | 471 | __u32 ports = TCP_COMBINED_PORTS(inet->dport, lport); |
472 | const int hash = inet_ehashfn(daddr, lport, saddr, inet->dport, tcp_ehash_size); | 472 | const int hash = inet_ehashfn(daddr, lport, saddr, inet->dport, tcp_hashinfo.ehash_size); |
473 | struct inet_ehash_bucket *head = &tcp_ehash[hash]; | 473 | struct inet_ehash_bucket *head = &tcp_hashinfo.ehash[hash]; |
474 | struct sock *sk2; | 474 | struct sock *sk2; |
475 | struct hlist_node *node; | 475 | struct hlist_node *node; |
476 | struct tcp_tw_bucket *tw; | 476 | struct tcp_tw_bucket *tw; |
@@ -478,7 +478,7 @@ static int __tcp_v4_check_established(struct sock *sk, __u16 lport, | |||
478 | write_lock(&head->lock); | 478 | write_lock(&head->lock); |
479 | 479 | ||
480 | /* Check TIME-WAIT sockets first. */ | 480 | /* Check TIME-WAIT sockets first. */ |
481 | sk_for_each(sk2, node, &(head + tcp_ehash_size)->chain) { | 481 | sk_for_each(sk2, node, &(head + tcp_hashinfo.ehash_size)->chain) { |
482 | tw = (struct tcp_tw_bucket *)sk2; | 482 | tw = (struct tcp_tw_bucket *)sk2; |
483 | 483 | ||
484 | if (TCP_IPV4_TW_MATCH(sk2, acookie, saddr, daddr, ports, dif)) { | 484 | if (TCP_IPV4_TW_MATCH(sk2, acookie, saddr, daddr, ports, dif)) { |
@@ -582,7 +582,7 @@ static inline int tcp_v4_hash_connect(struct sock *sk) | |||
582 | local_bh_disable(); | 582 | local_bh_disable(); |
583 | for (i = 1; i <= range; i++) { | 583 | for (i = 1; i <= range; i++) { |
584 | port = low + (i + offset) % range; | 584 | port = low + (i + offset) % range; |
585 | head = &tcp_bhash[inet_bhashfn(port, tcp_bhash_size)]; | 585 | head = &tcp_hashinfo.bhash[inet_bhashfn(port, tcp_hashinfo.bhash_size)]; |
586 | spin_lock(&head->lock); | 586 | spin_lock(&head->lock); |
587 | 587 | ||
588 | /* Does not bother with rcv_saddr checks, | 588 | /* Does not bother with rcv_saddr checks, |
@@ -602,7 +602,7 @@ static inline int tcp_v4_hash_connect(struct sock *sk) | |||
602 | } | 602 | } |
603 | } | 603 | } |
604 | 604 | ||
605 | tb = inet_bind_bucket_create(tcp_bucket_cachep, head, port); | 605 | tb = inet_bind_bucket_create(tcp_hashinfo.bind_bucket_cachep, head, port); |
606 | if (!tb) { | 606 | if (!tb) { |
607 | spin_unlock(&head->lock); | 607 | spin_unlock(&head->lock); |
608 | break; | 608 | break; |
@@ -637,7 +637,7 @@ ok: | |||
637 | goto out; | 637 | goto out; |
638 | } | 638 | } |
639 | 639 | ||
640 | head = &tcp_bhash[inet_bhashfn(snum, tcp_bhash_size)]; | 640 | head = &tcp_hashinfo.bhash[inet_bhashfn(snum, tcp_hashinfo.bhash_size)]; |
641 | tb = inet_sk(sk)->bind_hash; | 641 | tb = inet_sk(sk)->bind_hash; |
642 | spin_lock_bh(&head->lock); | 642 | spin_lock_bh(&head->lock); |
643 | if (sk_head(&tb->owners) == sk && !sk->sk_bind_node.next) { | 643 | if (sk_head(&tb->owners) == sk && !sk->sk_bind_node.next) { |
@@ -1926,7 +1926,7 @@ static void *listening_get_next(struct seq_file *seq, void *cur) | |||
1926 | 1926 | ||
1927 | if (!sk) { | 1927 | if (!sk) { |
1928 | st->bucket = 0; | 1928 | st->bucket = 0; |
1929 | sk = sk_head(&tcp_listening_hash[0]); | 1929 | sk = sk_head(&tcp_hashinfo.listening_hash[0]); |
1930 | goto get_sk; | 1930 | goto get_sk; |
1931 | } | 1931 | } |
1932 | 1932 | ||
@@ -1980,7 +1980,7 @@ start_req: | |||
1980 | read_unlock_bh(&tp->accept_queue.syn_wait_lock); | 1980 | read_unlock_bh(&tp->accept_queue.syn_wait_lock); |
1981 | } | 1981 | } |
1982 | if (++st->bucket < INET_LHTABLE_SIZE) { | 1982 | if (++st->bucket < INET_LHTABLE_SIZE) { |
1983 | sk = sk_head(&tcp_listening_hash[st->bucket]); | 1983 | sk = sk_head(&tcp_hashinfo.listening_hash[st->bucket]); |
1984 | goto get_sk; | 1984 | goto get_sk; |
1985 | } | 1985 | } |
1986 | cur = NULL; | 1986 | cur = NULL; |
@@ -2004,7 +2004,7 @@ static void *established_get_first(struct seq_file *seq) | |||
2004 | struct tcp_iter_state* st = seq->private; | 2004 | struct tcp_iter_state* st = seq->private; |
2005 | void *rc = NULL; | 2005 | void *rc = NULL; |
2006 | 2006 | ||
2007 | for (st->bucket = 0; st->bucket < tcp_ehash_size; ++st->bucket) { | 2007 | for (st->bucket = 0; st->bucket < tcp_hashinfo.ehash_size; ++st->bucket) { |
2008 | struct sock *sk; | 2008 | struct sock *sk; |
2009 | struct hlist_node *node; | 2009 | struct hlist_node *node; |
2010 | struct tcp_tw_bucket *tw; | 2010 | struct tcp_tw_bucket *tw; |
@@ -2012,8 +2012,8 @@ static void *established_get_first(struct seq_file *seq) | |||
2012 | /* We can reschedule _before_ having picked the target: */ | 2012 | /* We can reschedule _before_ having picked the target: */ |
2013 | cond_resched_softirq(); | 2013 | cond_resched_softirq(); |
2014 | 2014 | ||
2015 | read_lock(&tcp_ehash[st->bucket].lock); | 2015 | read_lock(&tcp_hashinfo.ehash[st->bucket].lock); |
2016 | sk_for_each(sk, node, &tcp_ehash[st->bucket].chain) { | 2016 | sk_for_each(sk, node, &tcp_hashinfo.ehash[st->bucket].chain) { |
2017 | if (sk->sk_family != st->family) { | 2017 | if (sk->sk_family != st->family) { |
2018 | continue; | 2018 | continue; |
2019 | } | 2019 | } |
@@ -2022,14 +2022,14 @@ static void *established_get_first(struct seq_file *seq) | |||
2022 | } | 2022 | } |
2023 | st->state = TCP_SEQ_STATE_TIME_WAIT; | 2023 | st->state = TCP_SEQ_STATE_TIME_WAIT; |
2024 | tw_for_each(tw, node, | 2024 | tw_for_each(tw, node, |
2025 | &tcp_ehash[st->bucket + tcp_ehash_size].chain) { | 2025 | &tcp_hashinfo.ehash[st->bucket + tcp_hashinfo.ehash_size].chain) { |
2026 | if (tw->tw_family != st->family) { | 2026 | if (tw->tw_family != st->family) { |
2027 | continue; | 2027 | continue; |
2028 | } | 2028 | } |
2029 | rc = tw; | 2029 | rc = tw; |
2030 | goto out; | 2030 | goto out; |
2031 | } | 2031 | } |
2032 | read_unlock(&tcp_ehash[st->bucket].lock); | 2032 | read_unlock(&tcp_hashinfo.ehash[st->bucket].lock); |
2033 | st->state = TCP_SEQ_STATE_ESTABLISHED; | 2033 | st->state = TCP_SEQ_STATE_ESTABLISHED; |
2034 | } | 2034 | } |
2035 | out: | 2035 | out: |
@@ -2056,15 +2056,15 @@ get_tw: | |||
2056 | cur = tw; | 2056 | cur = tw; |
2057 | goto out; | 2057 | goto out; |
2058 | } | 2058 | } |
2059 | read_unlock(&tcp_ehash[st->bucket].lock); | 2059 | read_unlock(&tcp_hashinfo.ehash[st->bucket].lock); |
2060 | st->state = TCP_SEQ_STATE_ESTABLISHED; | 2060 | st->state = TCP_SEQ_STATE_ESTABLISHED; |
2061 | 2061 | ||
2062 | /* We can reschedule between buckets: */ | 2062 | /* We can reschedule between buckets: */ |
2063 | cond_resched_softirq(); | 2063 | cond_resched_softirq(); |
2064 | 2064 | ||
2065 | if (++st->bucket < tcp_ehash_size) { | 2065 | if (++st->bucket < tcp_hashinfo.ehash_size) { |
2066 | read_lock(&tcp_ehash[st->bucket].lock); | 2066 | read_lock(&tcp_hashinfo.ehash[st->bucket].lock); |
2067 | sk = sk_head(&tcp_ehash[st->bucket].chain); | 2067 | sk = sk_head(&tcp_hashinfo.ehash[st->bucket].chain); |
2068 | } else { | 2068 | } else { |
2069 | cur = NULL; | 2069 | cur = NULL; |
2070 | goto out; | 2070 | goto out; |
@@ -2078,7 +2078,7 @@ get_tw: | |||
2078 | } | 2078 | } |
2079 | 2079 | ||
2080 | st->state = TCP_SEQ_STATE_TIME_WAIT; | 2080 | st->state = TCP_SEQ_STATE_TIME_WAIT; |
2081 | tw = tw_head(&tcp_ehash[st->bucket + tcp_ehash_size].chain); | 2081 | tw = tw_head(&tcp_hashinfo.ehash[st->bucket + tcp_hashinfo.ehash_size].chain); |
2082 | goto get_tw; | 2082 | goto get_tw; |
2083 | found: | 2083 | found: |
2084 | cur = sk; | 2084 | cur = sk; |
@@ -2173,7 +2173,7 @@ static void tcp_seq_stop(struct seq_file *seq, void *v) | |||
2173 | case TCP_SEQ_STATE_TIME_WAIT: | 2173 | case TCP_SEQ_STATE_TIME_WAIT: |
2174 | case TCP_SEQ_STATE_ESTABLISHED: | 2174 | case TCP_SEQ_STATE_ESTABLISHED: |
2175 | if (v) | 2175 | if (v) |
2176 | read_unlock(&tcp_ehash[st->bucket].lock); | 2176 | read_unlock(&tcp_hashinfo.ehash[st->bucket].lock); |
2177 | local_bh_enable(); | 2177 | local_bh_enable(); |
2178 | break; | 2178 | break; |
2179 | } | 2179 | } |
@@ -2432,7 +2432,6 @@ EXPORT_SYMBOL(ipv4_specific); | |||
2432 | EXPORT_SYMBOL(inet_bind_bucket_create); | 2432 | EXPORT_SYMBOL(inet_bind_bucket_create); |
2433 | EXPORT_SYMBOL(tcp_hashinfo); | 2433 | EXPORT_SYMBOL(tcp_hashinfo); |
2434 | EXPORT_SYMBOL(tcp_listen_wlock); | 2434 | EXPORT_SYMBOL(tcp_listen_wlock); |
2435 | EXPORT_SYMBOL(tcp_port_rover); | ||
2436 | EXPORT_SYMBOL(tcp_prot); | 2435 | EXPORT_SYMBOL(tcp_prot); |
2437 | EXPORT_SYMBOL(tcp_unhash); | 2436 | EXPORT_SYMBOL(tcp_unhash); |
2438 | EXPORT_SYMBOL(tcp_v4_conn_request); | 2437 | EXPORT_SYMBOL(tcp_v4_conn_request); |