Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751266AbdFFFLz (ORCPT ); Tue, 6 Jun 2017 01:11:55 -0400 Received: from mail-ot0-f196.google.com ([74.125.82.196]:33287 "EHLO mail-ot0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750704AbdFFFLx (ORCPT ); Tue, 6 Jun 2017 01:11:53 -0400 MIME-Version: 1.0 Reply-To: noloader@gmail.com In-Reply-To: <20170606005108.5646-3-Jason@zx2c4.com> References: <20170606005108.5646-1-Jason@zx2c4.com> <20170606005108.5646-3-Jason@zx2c4.com> From: Jeffrey Walton Date: Tue, 6 Jun 2017 01:11:51 -0400 Message-ID: Subject: Re: [PATCH v3 02/13] random: add get_random_{bytes,u32,u64,int,long,once}_wait family To: "Jason A. Donenfeld" Cc: "Theodore Ts'o" , Linux Crypto Mailing List , LKML , kernel-hardening@lists.openwall.com, Greg Kroah-Hartman , David Miller Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3073 Lines: 80 On Mon, Jun 5, 2017 at 8:50 PM, Jason A. Donenfeld 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 > --- > 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);