提交 5781b235 编写于 作者: E Eric Dumazet 提交者: 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: NYinghai Lu <yinghai@kernel.org>
Signed-off-by: NEric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 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% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册