Messages in this thread | | | Subject | Re: [PATCH] random: quiet urandom warning ratelimit suppression message | From | Ron Economos <> | Date | Thu, 16 Jun 2022 19:10:36 -0700 |
| |
On 6/16/22 6:20 AM, Jason A. Donenfeld wrote: > random.c ratelimits how much it warns about uninitialized urandom reads > using __ratelimit. When the RNG is finally initialized, it prints the > number of missed messages due to ratelimiting. > > It has been this way since that functionality was introduced back in > 2018. Recently, cc1e127bfa95 ("random: remove ratelimiting for in-kernel > unseeded randomness") put a bit more stress on the urandom ratelimiting, > which teased out a bug in the implementation. > > Specifically, when under pressure, __ratelimit() will print its own > message and reset the count back to 0, making the final message at the > end less useful. Secondly, it does so as a pr_warn(), which apparently > is undesirable for people's CI. > > Fortunately, __ratelimit() has the RATELIMIT_MSG_ON_RELEASE flag exactly > for this purpose, so we set the flag. > > Fixes: 4e00b339e264 ("random: rate limit unseeded randomness warnings") > Cc: stable@vger.kernel.org > Reported-by: Jon Hunter <jonathanh@nvidia.com> > Reported-by: Ron Economos <re@w6rz.net> > Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> > --- > drivers/char/random.c | 2 +- > include/linux/ratelimit_types.h | 12 ++++++++---- > 2 files changed, 9 insertions(+), 5 deletions(-) > > diff --git a/drivers/char/random.c b/drivers/char/random.c > index d0e4c89c4fcb..07a022e24057 100644 > --- a/drivers/char/random.c > +++ b/drivers/char/random.c > @@ -87,7 +87,7 @@ static struct fasync_struct *fasync; > > /* Control how we warn userspace. */ > static struct ratelimit_state urandom_warning = > - RATELIMIT_STATE_INIT("warn_urandom_randomness", HZ, 3); > + RATELIMIT_STATE_INIT_FLAGS("urandom_warning", HZ, 3, RATELIMIT_MSG_ON_RELEASE); > static int ratelimit_disable __read_mostly = > IS_ENABLED(CONFIG_WARN_ALL_UNSEEDED_RANDOM); > module_param_named(ratelimit_disable, ratelimit_disable, int, 0644); > diff --git a/include/linux/ratelimit_types.h b/include/linux/ratelimit_types.h > index c21c7f8103e2..002266693e50 100644 > --- a/include/linux/ratelimit_types.h > +++ b/include/linux/ratelimit_types.h > @@ -23,12 +23,16 @@ struct ratelimit_state { > unsigned long flags; > }; > > -#define RATELIMIT_STATE_INIT(name, interval_init, burst_init) { \ > - .lock = __RAW_SPIN_LOCK_UNLOCKED(name.lock), \ > - .interval = interval_init, \ > - .burst = burst_init, \ > +#define RATELIMIT_STATE_INIT_FLAGS(name, interval_init, burst_init, flags_init) { \ > + .lock = __RAW_SPIN_LOCK_UNLOCKED(name.lock), \ > + .interval = interval_init, \ > + .burst = burst_init, \ > + .flags = flags_init, \ > } > > +#define RATELIMIT_STATE_INIT(name, interval_init, burst_init) \ > + RATELIMIT_STATE_INIT_FLAGS(name, interval_init, burst_init, 0) > + > #define RATELIMIT_STATE_INIT_DISABLED \ > RATELIMIT_STATE_INIT(ratelimit_state, 0, DEFAULT_RATELIMIT_BURST) >
Tested on 5.15.48 kernel for RISC-V RV64. Works good, urandom_read_iter warnings are suppressed.
Tested-by: Ron Economos <re@w6rz.net>
| |