Commit 2086a650 authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by David S. Miller

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: default avatarPavel Emelyanov <xemul@openvz.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7f635ab7
...@@ -211,14 +211,14 @@ extern void inet_bind_hash(struct sock *sk, struct inet_bind_bucket *tb, ...@@ -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, ...@@ -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, ...@@ -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);
......
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