]> Pileus Git - ~andy/linux/commitdiff
ipv4: split inet_ehashfn to hash functions per compilation unit
authorHannes Frederic Sowa <hannes@stressinduktion.org>
Sat, 19 Oct 2013 19:48:51 +0000 (21:48 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sat, 19 Oct 2013 23:45:34 +0000 (19:45 -0400)
This duplicates a bit of code but let's us easily introduce
separate secret keys later. The separate compilation units are
ipv4/inet_hashtabbles.o, ipv4/udp.o and rds/connection.o.

Cc: Eric Dumazet <edumazet@google.com>
Cc: "David S. Miller" <davem@davemloft.net>
Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/inet_sock.h
net/ipv4/inet_hashtables.c
net/ipv4/udp.c
net/rds/connection.c

index 06da91efbc83017585ddf275b019b1253e3e7c68..7a6c7f80a8fd7f9c59b5299d10981613d09557e7 100644 (file)
@@ -208,26 +208,16 @@ extern u32 inet_ehash_secret;
 extern u32 ipv6_hash_secret;
 void build_ehash_secret(void);
 
-static inline unsigned int inet_ehashfn(struct net *net,
-                                       const __be32 laddr, const __u16 lport,
-                                       const __be32 faddr, const __be16 fport)
+static inline unsigned int __inet_ehashfn(const __be32 laddr,
+                                         const __u16 lport,
+                                         const __be32 faddr,
+                                         const __be16 fport,
+                                         u32 initval)
 {
        return jhash_3words((__force __u32) laddr,
                            (__force __u32) faddr,
                            ((__u32) lport) << 16 | (__force __u32)fport,
-                           inet_ehash_secret + net_hash_mix(net));
-}
-
-static inline int inet_sk_ehashfn(const struct sock *sk)
-{
-       const struct inet_sock *inet = inet_sk(sk);
-       const __be32 laddr = inet->inet_rcv_saddr;
-       const __u16 lport = inet->inet_num;
-       const __be32 faddr = inet->inet_daddr;
-       const __be16 fport = inet->inet_dport;
-       struct net *net = sock_net(sk);
-
-       return inet_ehashfn(net, laddr, lport, faddr, fport);
+                           initval);
 }
 
 static inline struct request_sock *inet_reqsk_alloc(struct request_sock_ops *ops)
index a4b66bbe4f218160b893a6e719ff60acf3e05ae7..18aa668d0cc96bb33911d3014727690377a8bc6d 100644 (file)
 #include <net/secure_seq.h>
 #include <net/ip.h>
 
+static unsigned int inet_ehashfn(struct net *net, const __be32 laddr,
+                                const __u16 lport, const __be32 faddr,
+                                const __be16 fport)
+{
+       return __inet_ehashfn(laddr, lport, faddr, fport,
+                             inet_ehash_secret + net_hash_mix(net));
+}
+
+
+static unsigned int inet_sk_ehashfn(const struct sock *sk)
+{
+       const struct inet_sock *inet = inet_sk(sk);
+       const __be32 laddr = inet->inet_rcv_saddr;
+       const __u16 lport = inet->inet_num;
+       const __be32 faddr = inet->inet_daddr;
+       const __be16 fport = inet->inet_dport;
+       struct net *net = sock_net(sk);
+
+       return inet_ehashfn(net, laddr, lport, faddr, fport);
+}
+
 /*
  * Allocate and initialize a new local port bind bucket.
  * The bindhash mutex for snum's hash chain must be held here.
index 9f27bb800607d5b0701fe6a8dd6a702eeb58e6e8..b4437c7db6cec846ef6b5055f9736f0bb236c896 100644 (file)
@@ -407,6 +407,14 @@ static inline int compute_score2(struct sock *sk, struct net *net,
        return score;
 }
 
+static unsigned int udp_ehashfn(struct net *net, const __be32 laddr,
+                                const __u16 lport, const __be32 faddr,
+                                const __be16 fport)
+{
+       return __inet_ehashfn(laddr, lport, faddr, fport,
+                             inet_ehash_secret + net_hash_mix(net));
+}
+
 
 /* called with read_rcu_lock() */
 static struct sock *udp4_lib_lookup2(struct net *net,
@@ -430,8 +438,8 @@ begin:
                        badness = score;
                        reuseport = sk->sk_reuseport;
                        if (reuseport) {
-                               hash = inet_ehashfn(net, daddr, hnum,
-                                                   saddr, sport);
+                               hash = udp_ehashfn(net, daddr, hnum,
+                                                  saddr, sport);
                                matches = 1;
                        }
                } else if (score == badness && reuseport) {
@@ -511,8 +519,8 @@ begin:
                        badness = score;
                        reuseport = sk->sk_reuseport;
                        if (reuseport) {
-                               hash = inet_ehashfn(net, daddr, hnum,
-                                                   saddr, sport);
+                               hash = udp_ehashfn(net, daddr, hnum,
+                                                  saddr, sport);
                                matches = 1;
                        }
                } else if (score == badness && reuseport) {
index 642ad42c416ba915680645d8bc3539e5bdee4bf5..45e23660437a6ed15006e7a125cea99183c86c04 100644 (file)
@@ -52,9 +52,9 @@ static struct kmem_cache *rds_conn_slab;
 static struct hlist_head *rds_conn_bucket(__be32 laddr, __be32 faddr)
 {
        /* Pass NULL, don't need struct net for hash */
-       unsigned long hash = inet_ehashfn(NULL,
-                                         be32_to_cpu(laddr), 0,
-                                         be32_to_cpu(faddr), 0);
+       unsigned long hash = __inet_ehashfn(be32_to_cpu(laddr), 0,
+                                           be32_to_cpu(faddr), 0,
+                                           inet_ehash_secret);
        return &rds_conn_hash[hash & RDS_CONNECTION_HASH_MASK];
 }