|
@@ -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
|