random32: add prandom_seed_full_state helper

Factor out the full reseed handling code that populates the state
through get_random_bytes() and runs prandom_warmup(). The resulting
prandom_seed_full_state() will be used later on in more than the
current __prandom_reseed() user. Fix also two minor whitespace
issues along the way.

Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Daniel Borkmann 2015-10-08 01:20:37 +02:00 коммит произвёл David S. Miller
Родитель c90aeb9482
Коммит 0dd50d1b0c
1 изменённых файлов: 21 добавлений и 16 удалений

Просмотреть файл

@ -181,7 +181,7 @@ void prandom_seed(u32 entropy)
* No locking on the CPUs, but then somewhat random results are, well, * No locking on the CPUs, but then somewhat random results are, well,
* expected. * expected.
*/ */
for_each_possible_cpu (i) { for_each_possible_cpu(i) {
struct rnd_state *state = &per_cpu(net_rand_state, i); struct rnd_state *state = &per_cpu(net_rand_state, i);
state->s1 = __seed(state->s1 ^ entropy, 2U); state->s1 = __seed(state->s1 ^ entropy, 2U);
@ -201,7 +201,7 @@ static int __init prandom_init(void)
prandom_state_selftest(); prandom_state_selftest();
for_each_possible_cpu(i) { for_each_possible_cpu(i) {
struct rnd_state *state = &per_cpu(net_rand_state,i); struct rnd_state *state = &per_cpu(net_rand_state, i);
u32 weak_seed = (i + jiffies) ^ random_get_entropy(); u32 weak_seed = (i + jiffies) ^ random_get_entropy();
prandom_seed_early(state, weak_seed, true); prandom_seed_early(state, weak_seed, true);
@ -238,13 +238,30 @@ static void __init __prandom_start_seed_timer(void)
add_timer(&seed_timer); add_timer(&seed_timer);
} }
static void prandom_seed_full_state(struct rnd_state __percpu *pcpu_state)
{
int i;
for_each_possible_cpu(i) {
struct rnd_state *state = per_cpu_ptr(pcpu_state, i);
u32 seeds[4];
get_random_bytes(&seeds, sizeof(seeds));
state->s1 = __seed(seeds[0], 2U);
state->s2 = __seed(seeds[1], 8U);
state->s3 = __seed(seeds[2], 16U);
state->s4 = __seed(seeds[3], 128U);
prandom_warmup(state);
}
}
/* /*
* Generate better values after random number generator * Generate better values after random number generator
* is fully initialized. * is fully initialized.
*/ */
static void __prandom_reseed(bool late) static void __prandom_reseed(bool late)
{ {
int i;
unsigned long flags; unsigned long flags;
static bool latch = false; static bool latch = false;
static DEFINE_SPINLOCK(lock); static DEFINE_SPINLOCK(lock);
@ -266,19 +283,7 @@ static void __prandom_reseed(bool late)
goto out; goto out;
latch = true; latch = true;
prandom_seed_full_state(&net_rand_state);
for_each_possible_cpu(i) {
struct rnd_state *state = &per_cpu(net_rand_state,i);
u32 seeds[4];
get_random_bytes(&seeds, sizeof(seeds));
state->s1 = __seed(seeds[0], 2U);
state->s2 = __seed(seeds[1], 8U);
state->s3 = __seed(seeds[2], 16U);
state->s4 = __seed(seeds[3], 128U);
prandom_warmup(state);
}
out: out:
spin_unlock_irqrestore(&lock, flags); spin_unlock_irqrestore(&lock, flags);
} }