[NET]: inet_ehash_secret should be __read_mostly and set only once
There is a very tiny probability that build_ehash_secret() is called at the same time by different CPUS. Also, using __read_mostly is a must for inet_ehash_secret Signed-off-by: Eric Dumazet <dada1@cosmosbay.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
35fc92a9de
commit
be776281ae
1 changed files with 13 additions and 3 deletions
|
@ -218,13 +218,23 @@ out:
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 inet_ehash_secret;
|
u32 inet_ehash_secret __read_mostly;
|
||||||
EXPORT_SYMBOL(inet_ehash_secret);
|
EXPORT_SYMBOL(inet_ehash_secret);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* inet_ehash_secret must be set exactly once
|
||||||
|
* Instead of using a dedicated spinlock, we (ab)use inetsw_lock
|
||||||
|
*/
|
||||||
void build_ehash_secret(void)
|
void build_ehash_secret(void)
|
||||||
{
|
{
|
||||||
while (!inet_ehash_secret)
|
u32 rnd;
|
||||||
get_random_bytes(&inet_ehash_secret, 4);
|
do {
|
||||||
|
get_random_bytes(&rnd, sizeof(rnd));
|
||||||
|
} while (rnd == 0);
|
||||||
|
spin_lock_bh(&inetsw_lock);
|
||||||
|
if (!inet_ehash_secret)
|
||||||
|
inet_ehash_secret = rnd;
|
||||||
|
spin_unlock_bh(&inetsw_lock);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(build_ehash_secret);
|
EXPORT_SYMBOL(build_ehash_secret);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue