inet: convert inet_ehash_secret and ipv6_hash_secret to net_get_random_once
Initialize the ehash and ipv6_hash_secrets with net_get_random_once. Each compilation unit gets its own secret now: ipv4/inet_hashtables.o ipv4/udp.o ipv6/inet6_hashtables.o ipv6/udp.o rds/connection.o The functions still get inlined into the hashing functions. In the fast path we have at most two (needed in ipv6) if (unlikely(...)). 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>
This commit is contained in:
parent
b23a002fc6
commit
1bbdceef1e
8 changed files with 44 additions and 46 deletions
|
@ -245,29 +245,6 @@ out:
|
|||
}
|
||||
EXPORT_SYMBOL(inet_listen);
|
||||
|
||||
u32 inet_ehash_secret __read_mostly;
|
||||
EXPORT_SYMBOL(inet_ehash_secret);
|
||||
|
||||
u32 ipv6_hash_secret __read_mostly;
|
||||
EXPORT_SYMBOL(ipv6_hash_secret);
|
||||
|
||||
/*
|
||||
* inet_ehash_secret must be set exactly once, and to a non nul value
|
||||
* ipv6_hash_secret must be set exactly once.
|
||||
*/
|
||||
void build_ehash_secret(void)
|
||||
{
|
||||
u32 rnd;
|
||||
|
||||
do {
|
||||
get_random_bytes(&rnd, sizeof(rnd));
|
||||
} while (rnd == 0);
|
||||
|
||||
if (cmpxchg(&inet_ehash_secret, 0, rnd) == 0)
|
||||
get_random_bytes(&ipv6_hash_secret, sizeof(ipv6_hash_secret));
|
||||
}
|
||||
EXPORT_SYMBOL(build_ehash_secret);
|
||||
|
||||
/*
|
||||
* Create an inet socket.
|
||||
*/
|
||||
|
@ -284,10 +261,6 @@ static int inet_create(struct net *net, struct socket *sock, int protocol,
|
|||
int try_loading_module = 0;
|
||||
int err;
|
||||
|
||||
if (unlikely(!inet_ehash_secret))
|
||||
if (sock->type != SOCK_RAW && sock->type != SOCK_DGRAM)
|
||||
build_ehash_secret();
|
||||
|
||||
sock->state = SS_UNCONNECTED;
|
||||
|
||||
/* Look for the requested type/protocol pair. */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue