mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-17 06:17:35 +00:00
[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
@ -218,13 +218,23 @@ out:
|
||||
return err;
|
||||
}
|
||||
|
||||
u32 inet_ehash_secret;
|
||||
u32 inet_ehash_secret __read_mostly;
|
||||
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)
|
||||
{
|
||||
while (!inet_ehash_secret)
|
||||
get_random_bytes(&inet_ehash_secret, 4);
|
||||
u32 rnd;
|
||||
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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user