On Mon, Jun 5, 2017 at 8:50 PM, Jason A. Donenfeld <Jason@xxxxxxxxx> wrote: > These functions are simple convenience wrappers that call > wait_for_random_bytes before calling the respective get_random_* > function. It may be advantageous to add a timeout, too. There's been a number of times I did not want to wait an INFINITE amount of time for a completion. (In another context). Jeff > Signed-off-by: Jason A. Donenfeld <Jason@xxxxxxxxx> > --- > include/linux/net.h | 2 ++ > include/linux/once.h | 2 ++ > include/linux/random.h | 25 +++++++++++++++++++++++++ > 3 files changed, 29 insertions(+) > > diff --git a/include/linux/net.h b/include/linux/net.h > index abcfa46a2bd9..dda2cc939a53 100644 > --- a/include/linux/net.h > +++ b/include/linux/net.h > @@ -274,6 +274,8 @@ do { \ > > #define net_get_random_once(buf, nbytes) \ > get_random_once((buf), (nbytes)) > +#define net_get_random_once_wait(buf, nbytes) \ > + get_random_once_wait((buf), (nbytes)) > > int kernel_sendmsg(struct socket *sock, struct msghdr *msg, struct kvec *vec, > size_t num, size_t len); > diff --git a/include/linux/once.h b/include/linux/once.h > index 285f12cb40e6..9c98aaa87cbc 100644 > --- a/include/linux/once.h > +++ b/include/linux/once.h > @@ -53,5 +53,7 @@ void __do_once_done(bool *done, struct static_key *once_key, > > #define get_random_once(buf, nbytes) \ > DO_ONCE(get_random_bytes, (buf), (nbytes)) > +#define get_random_once_wait(buf, nbytes) \ > + DO_ONCE(get_random_bytes_wait, (buf), (nbytes)) \ > > #endif /* _LINUX_ONCE_H */ > diff --git a/include/linux/random.h b/include/linux/random.h > index e29929347c95..4aecc339558d 100644 > --- a/include/linux/random.h > +++ b/include/linux/random.h > @@ -58,6 +58,31 @@ static inline unsigned long get_random_long(void) > #endif > } > > +/* Calls wait_for_random_bytes() and then calls get_random_bytes(buf, nbytes). > + * Returns the result of the call to wait_for_random_bytes. */ > +static inline int get_random_bytes_wait(void *buf, int nbytes) > +{ > + int ret = wait_for_random_bytes(); > + if (unlikely(ret)) > + return ret; > + get_random_bytes(buf, nbytes); > + return 0; > +} > + > +#define declare_get_random_var_wait(var) \ > + static inline int get_random_ ## var ## _wait(var *out) { \ > + int ret = wait_for_random_bytes(); \ > + if (unlikely(ret)) \ > + return ret; \ > + *out = get_random_ ## var(); \ > + return 0; \ > + } > +declare_get_random_var_wait(u32) > +declare_get_random_var_wait(u64) > +declare_get_random_var_wait(int) > +declare_get_random_var_wait(long) > +#undef declare_get_random_var > + > unsigned long randomize_page(unsigned long start, unsigned long range); > > u32 prandom_u32(void);