diff options
author | Flavio Leitner <fbl@redhat.com> | 2012-01-25 12:34:52 +0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-01-26 06:50:43 +0400 |
commit | fddb7b5761f104f034a0e708ece756d9b2eb2cac (patch) | |
tree | f995ec889ebc1edc3fc9d3b0fe1da1fe9c2d6b76 /net/ipv4/inet_connection_sock.c | |
parent | 2b05ad33e1e624e7f08b8676d270dc7725403b7e (diff) | |
download | linux-fddb7b5761f104f034a0e708ece756d9b2eb2cac.tar.xz |
tcp: bind() optimize port allocation
Port autoselection finds a port and then drop the lock,
then right after that, gets the hash bucket again and lock it.
Fix it to go direct.
Signed-off-by: Flavio Leitner <fbl@redhat.com>
Signed-off-by: Marcelo Ricardo Leitner <mleitner@redhat.com>
Acked-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/inet_connection_sock.c')
-rw-r--r-- | net/ipv4/inet_connection_sock.c | 6 |
1 files changed, 2 insertions, 4 deletions
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index ecd19b5a7ee2..19d66cefd7d3 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c @@ -123,15 +123,13 @@ again: smallest_size = tb->num_owners; smallest_rover = rover; if (atomic_read(&hashinfo->bsockets) > (high - low) + 1) { - spin_unlock(&head->lock); snum = smallest_rover; - goto have_snum; + goto tb_found; } } if (!inet_csk(sk)->icsk_af_ops->bind_conflict(sk, tb)) { - spin_unlock(&head->lock); snum = rover; - goto have_snum; + goto tb_found; } goto next; } |