mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-28 20:02:17 +00:00
![Jason A. Donenfeld](/assets/img/avatar_default.png)
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,cc1e127bfa
("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:4e00b339e2
("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> Tested-by: Ron Economos <re@w6rz.net> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
47 lines
1.3 KiB
C
47 lines
1.3 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _LINUX_RATELIMIT_TYPES_H
|
|
#define _LINUX_RATELIMIT_TYPES_H
|
|
|
|
#include <linux/bits.h>
|
|
#include <linux/param.h>
|
|
#include <linux/spinlock_types_raw.h>
|
|
|
|
#define DEFAULT_RATELIMIT_INTERVAL (5 * HZ)
|
|
#define DEFAULT_RATELIMIT_BURST 10
|
|
|
|
/* issue num suppressed message on exit */
|
|
#define RATELIMIT_MSG_ON_RELEASE BIT(0)
|
|
|
|
struct ratelimit_state {
|
|
raw_spinlock_t lock; /* protect the state */
|
|
|
|
int interval;
|
|
int burst;
|
|
int printed;
|
|
int missed;
|
|
unsigned long begin;
|
|
unsigned long flags;
|
|
};
|
|
|
|
#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)
|
|
|
|
#define DEFINE_RATELIMIT_STATE(name, interval_init, burst_init) \
|
|
\
|
|
struct ratelimit_state name = \
|
|
RATELIMIT_STATE_INIT(name, interval_init, burst_init) \
|
|
|
|
extern int ___ratelimit(struct ratelimit_state *rs, const char *func);
|
|
#define __ratelimit(state) ___ratelimit(state, __func__)
|
|
|
|
#endif /* _LINUX_RATELIMIT_TYPES_H */
|