Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d5d28375 authored by David S. Miller's avatar David S. Miller
Browse files

[TCP]: Document non-trivial locking path in tcp_v{4,6}_get_port().



This trips up a lot of folks reading this code.
Put an unlikely() around the port-exhaustion test
for good measure.

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 89ebd197
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -242,9 +242,14 @@ static int tcp_v4_get_port(struct sock *sk, unsigned short snum)
		tcp_port_rover = rover;
		spin_unlock(&tcp_portalloc_lock);

		/* Exhausted local port range during search? */
		/* Exhausted local port range during search?  It is not
		 * possible for us to be holding one of the bind hash
		 * locks if this test triggers, because if 'remaining'
		 * drops to zero, we broke out of the do/while loop at
		 * the top level, not from the 'break;' statement.
		 */
		ret = 1;
		if (remaining <= 0)
		if (unlikely(remaining <= 0))
			goto fail;

		/* OK, here is the one we will use.  HEAD is
+7 −2
Original line number Diff line number Diff line
@@ -158,9 +158,14 @@ static int tcp_v6_get_port(struct sock *sk, unsigned short snum)
		tcp_port_rover = rover;
		spin_unlock(&tcp_portalloc_lock);

		/* Exhausted local port range during search? */
		/* Exhausted local port range during search?  It is not
		 * possible for us to be holding one of the bind hash
		 * locks if this test triggers, because if 'remaining'
		 * drops to zero, we broke out of the do/while loop at
		 * the top level, not from the 'break;' statement.
		 */
		ret = 1;
		if (remaining <= 0)
		if (unlikely(remaining <= 0))
			goto fail;

		/* OK, here is the one we will use. */