Commit 5781b235 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller

udp: udp_lib_get_port() fix

Now we can have a large udp hash table, udp_lib_get_port() loop
should be converted to a do {} while (cond) form,
or we dont enter it at all if hash table size is exactly 65536.
Reported-by: default avatarYinghai Lu <yinghai@kernel.org>
Signed-off-by: default avatarEric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e1187b3b
...@@ -216,9 +216,8 @@ int udp_lib_get_port(struct sock *sk, unsigned short snum, ...@@ -216,9 +216,8 @@ int udp_lib_get_port(struct sock *sk, unsigned short snum,
* force rand to be an odd multiple of UDP_HTABLE_SIZE * force rand to be an odd multiple of UDP_HTABLE_SIZE
*/ */
rand = (rand | 1) * (udptable->mask + 1); rand = (rand | 1) * (udptable->mask + 1);
for (last = first + udptable->mask + 1; last = first + udptable->mask + 1;
first != last; do {
first++) {
hslot = udp_hashslot(udptable, net, first); hslot = udp_hashslot(udptable, net, first);
bitmap_zero(bitmap, PORTS_PER_CHAIN); bitmap_zero(bitmap, PORTS_PER_CHAIN);
spin_lock_bh(&hslot->lock); spin_lock_bh(&hslot->lock);
...@@ -238,7 +237,7 @@ int udp_lib_get_port(struct sock *sk, unsigned short snum, ...@@ -238,7 +237,7 @@ int udp_lib_get_port(struct sock *sk, unsigned short snum,
snum += rand; snum += rand;
} while (snum != first); } while (snum != first);
spin_unlock_bh(&hslot->lock); spin_unlock_bh(&hslot->lock);
} } while (++first != last);
goto fail; goto fail;
} else { } else {
hslot = udp_hashslot(udptable, net, snum); hslot = udp_hashslot(udptable, net, snum);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment