inet: add struct net argument to inet_lhashfn
authorPavel Emelyanov <xemul@openvz.org>
Tue, 17 Jun 2008 00:13:08 +0000 (17:13 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 17 Jun 2008 00:13:08 +0000 (17:13 -0700)
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>
include/net/inet_hashtables.h
net/ipv4/inet_hashtables.c
net/ipv6/inet6_hashtables.c

index 61dd3317089ce0a572ae8689a4e8f28e63cf3700..26336cdcdc11533934026424d8cc33921065476a 100644 (file)
@@ -211,14 +211,14 @@ extern void inet_bind_hash(struct sock *sk, struct inet_bind_bucket *tb,
                           const unsigned short snum);
 
 /* 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);
 }
 
 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. */
index dc1b78de89903b32e09440af798b20fa65b3b863..4f597b3175e7da3842e398c20e3668568b6b9d58 100644 (file)
@@ -194,7 +194,7 @@ struct sock *__inet_lookup_listener(struct net *net,
        const struct hlist_head *head;
 
        read_lock(&hashinfo->lhash_lock);
-       head = &hashinfo->listening_hash[inet_lhashfn(hnum)];
+       head = &hashinfo->listening_hash[inet_lhashfn(net, hnum)];
        if (!hlist_empty(head)) {
                const struct inet_sock *inet = inet_sk((sk = __sk_head(head)));
 
index 580014aea4d6f69c340e7d28fb2a508454ea9300..b940156ca4f5727411d0c19ba433a6045b886054 100644 (file)
@@ -104,7 +104,8 @@ struct sock *inet6_lookup_listener(struct net *net,
        int score, hiscore = 0;
 
        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 &&
                                sk->sk_family == PF_INET6) {
                        const struct ipv6_pinfo *np = inet6_sk(sk);