random32: add prandom_init_once helper for own rngs
authorDaniel Borkmann <daniel@iogearbox.net>
Wed, 7 Oct 2015 23:20:38 +0000 (01:20 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 8 Oct 2015 12:26:38 +0000 (05:26 -0700)
Add a prandom_init_once() facility that works on the rnd_state, so that
users that are keeping their own state independent from prandom_u32() can
initialize their taus113 per cpu states.

The motivation here is similar to net_get_random_once(): initialize the
state as late as possible in the hope that enough entropy has been
collected for the seeding. prandom_init_once() makes use of the recently
introduced prandom_seed_full_state() helper and is generic enough so that
it could also be used on fast-paths due to the DO_ONCE().

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>
include/linux/random.h
lib/random32.c

index e651874df2c9d7f7e45187900d4c5de84df03307..a75840c1aa71414acc43468da6cc8f83ec06c1b8 100644 (file)
@@ -7,6 +7,8 @@
 #define _LINUX_RANDOM_H
 
 #include <linux/list.h>
+#include <linux/once.h>
+
 #include <uapi/linux/random.h>
 
 struct random_ready_callback {
@@ -45,6 +47,10 @@ struct rnd_state {
 
 u32 prandom_u32_state(struct rnd_state *state);
 void prandom_bytes_state(struct rnd_state *state, void *buf, size_t nbytes);
+void prandom_seed_full_state(struct rnd_state __percpu *pcpu_state);
+
+#define prandom_init_once(pcpu_state)                  \
+       DO_ONCE(prandom_seed_full_state, (pcpu_state))
 
 /**
  * prandom_u32_max - returns a pseudo-random number in interval [0, ep_ro)
index 36c09fb3fec90044a7d92ee0cf277607ee479068..12111910ccd076aaa1d01cbb9a9623306514a6cd 100644 (file)
@@ -238,7 +238,7 @@ static void __init __prandom_start_seed_timer(void)
        add_timer(&seed_timer);
 }
 
-static void prandom_seed_full_state(struct rnd_state __percpu *pcpu_state)
+void prandom_seed_full_state(struct rnd_state __percpu *pcpu_state)
 {
        int i;