Message ID | 20170606005108.5646-3-Jason@zx2c4.com (mailing list archive) |
---|---|
State | Not Applicable |
Delegated to: | Herbert Xu |
Headers | show |
On Mon, Jun 5, 2017 at 8:50 PM, Jason A. Donenfeld <Jason@zx2c4.com> 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@zx2c4.com> > --- > 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);
On Tue, Jun 6, 2017 at 7:11 AM, Jeffrey Walton <noloader@gmail.com> wrote: > On Mon, Jun 5, 2017 at 8:50 PM, Jason A. Donenfeld <Jason@zx2c4.com> 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. This was in v1, but was removed because of a lack of particular use case in this context.
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);
These functions are simple convenience wrappers that call wait_for_random_bytes before calling the respective get_random_* function. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> --- include/linux/net.h | 2 ++ include/linux/once.h | 2 ++ include/linux/random.h | 25 +++++++++++++++++++++++++ 3 files changed, 29 insertions(+)