random32: add prandom_seed_full_state helper
authorDaniel Borkmann <daniel@iogearbox.net>
Wed, 7 Oct 2015 23:20:37 +0000 (01:20 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 8 Oct 2015 12:26:37 +0000 (05:26 -0700)
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>
lib/random32.c

index 0bee183fa18faaf3314ac37244469f111408cd26..36c09fb3fec90044a7d92ee0cf277607ee479068 100644 (file)
@@ -181,7 +181,7 @@ void prandom_seed(u32 entropy)
         * No locking on the CPUs, but then somewhat random results are, well,
         * expected.
         */
-       for_each_possible_cpu (i) {
+       for_each_possible_cpu(i) {
                struct rnd_state *state = &per_cpu(net_rand_state, i);
 
                state->s1 = __seed(state->s1 ^ entropy, 2U);
@@ -201,7 +201,7 @@ static int __init prandom_init(void)
        prandom_state_selftest();
 
        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();
 
                prandom_seed_early(state, weak_seed, true);
@@ -238,13 +238,30 @@ static void __init __prandom_start_seed_timer(void)
        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
  *     is fully initialized.
  */
 static void __prandom_reseed(bool late)
 {
-       int i;
        unsigned long flags;
        static bool latch = false;
        static DEFINE_SPINLOCK(lock);
@@ -266,19 +283,7 @@ static void __prandom_reseed(bool late)
                goto out;
 
        latch = true;
-
-       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);
-       }
+       prandom_seed_full_state(&net_rand_state);
 out:
        spin_unlock_irqrestore(&lock, flags);
 }