mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-18 23:18:20 +00:00
inet: add struct net argument to inet_lhashfn
Listening-on-one-port sockets in many namespaces produce long chains in the listening_hash-es, so prepare the inet_lhashfn to take struct net into account. Signed-off-by: Pavel Emelyanov <xemul@openvz.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
7f635ab71e
commit
2086a65078
@ -211,14 +211,14 @@ extern void inet_bind_hash(struct sock *sk, struct inet_bind_bucket *tb,
|
|||||||
const unsigned short snum);
|
const unsigned short snum);
|
||||||
|
|
||||||
/* These can have wildcards, don't try too hard. */
|
/* These can have wildcards, don't try too hard. */
|
||||||
static inline int inet_lhashfn(const unsigned short num)
|
static inline int inet_lhashfn(struct net *net, const unsigned short num)
|
||||||
{
|
{
|
||||||
return num & (INET_LHTABLE_SIZE - 1);
|
return num & (INET_LHTABLE_SIZE - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int inet_sk_listen_hashfn(const struct sock *sk)
|
static inline int inet_sk_listen_hashfn(const struct sock *sk)
|
||||||
{
|
{
|
||||||
return inet_lhashfn(inet_sk(sk)->num);
|
return inet_lhashfn(sock_net(sk), inet_sk(sk)->num);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Caller must disable local BH processing. */
|
/* Caller must disable local BH processing. */
|
||||||
|
@ -194,7 +194,7 @@ struct sock *__inet_lookup_listener(struct net *net,
|
|||||||
const struct hlist_head *head;
|
const struct hlist_head *head;
|
||||||
|
|
||||||
read_lock(&hashinfo->lhash_lock);
|
read_lock(&hashinfo->lhash_lock);
|
||||||
head = &hashinfo->listening_hash[inet_lhashfn(hnum)];
|
head = &hashinfo->listening_hash[inet_lhashfn(net, hnum)];
|
||||||
if (!hlist_empty(head)) {
|
if (!hlist_empty(head)) {
|
||||||
const struct inet_sock *inet = inet_sk((sk = __sk_head(head)));
|
const struct inet_sock *inet = inet_sk((sk = __sk_head(head)));
|
||||||
|
|
||||||
|
@ -104,7 +104,8 @@ struct sock *inet6_lookup_listener(struct net *net,
|
|||||||
int score, hiscore = 0;
|
int score, hiscore = 0;
|
||||||
|
|
||||||
read_lock(&hashinfo->lhash_lock);
|
read_lock(&hashinfo->lhash_lock);
|
||||||
sk_for_each(sk, node, &hashinfo->listening_hash[inet_lhashfn(hnum)]) {
|
sk_for_each(sk, node,
|
||||||
|
&hashinfo->listening_hash[inet_lhashfn(net, hnum)]) {
|
||||||
if (net_eq(sock_net(sk), net) && inet_sk(sk)->num == hnum &&
|
if (net_eq(sock_net(sk), net) && inet_sk(sk)->num == hnum &&
|
||||||
sk->sk_family == PF_INET6) {
|
sk->sk_family == PF_INET6) {
|
||||||
const struct ipv6_pinfo *np = inet6_sk(sk);
|
const struct ipv6_pinfo *np = inet6_sk(sk);
|
||||||
|
Loading…
Reference in New Issue
Block a user