Commit 897ece56 authored by Daniel Borkmann's avatar Daniel Borkmann Committed by David S. Miller

random32: add prandom_init_once helper for own rngs

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: default avatarDaniel Borkmann <daniel@iogearbox.net>
Acked-by: default avatarHannes Frederic Sowa <hannes@stressinduktion.org>
Acked-by: default avatarAlexei Starovoitov <ast@kernel.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0dd50d1b
...@@ -7,6 +7,8 @@ ...@@ -7,6 +7,8 @@
#define _LINUX_RANDOM_H #define _LINUX_RANDOM_H
#include <linux/list.h> #include <linux/list.h>
#include <linux/once.h>
#include <uapi/linux/random.h> #include <uapi/linux/random.h>
struct random_ready_callback { struct random_ready_callback {
...@@ -45,6 +47,10 @@ struct rnd_state { ...@@ -45,6 +47,10 @@ struct rnd_state {
u32 prandom_u32_state(struct rnd_state *state); u32 prandom_u32_state(struct rnd_state *state);
void prandom_bytes_state(struct rnd_state *state, void *buf, size_t nbytes); 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) * prandom_u32_max - returns a pseudo-random number in interval [0, ep_ro)
......
...@@ -238,7 +238,7 @@ static void __init __prandom_start_seed_timer(void) ...@@ -238,7 +238,7 @@ 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) void prandom_seed_full_state(struct rnd_state __percpu *pcpu_state)
{ {
int i; int i;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment