| From foo@baz Thu Jun 16 06:59:24 PM CEST 2022 |
| From: "Stephan Müller" <smueller@chronox.de> |
| Date: Tue, 27 Dec 2016 23:40:59 +0100 |
| Subject: random: remove variable limit |
| |
| From: "Stephan Müller" <smueller@chronox.de> |
| |
| commit 43d8a72cd985ca5279a9eb84d61fcbb3ee3d3774 upstream. |
| |
| The variable limit was used to identify the nonblocking pool's unlimited |
| random number generation. As the nonblocking pool is a thing of the |
| past, remove the limit variable and any conditions around it (i.e. |
| preserve the branches for limit == 1). |
| |
| Signed-off-by: Stephan Mueller <smueller@chronox.de> |
| Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
| Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/char/random.c | 32 ++++++++------------------------ |
| 1 file changed, 8 insertions(+), 24 deletions(-) |
| |
| --- a/drivers/char/random.c |
| +++ b/drivers/char/random.c |
| @@ -478,7 +478,6 @@ struct entropy_store { |
| int entropy_count; |
| int entropy_total; |
| unsigned int initialized:1; |
| - unsigned int limit:1; |
| unsigned int last_data_init:1; |
| __u8 last_data[EXTRACT_SIZE]; |
| }; |
| @@ -496,7 +495,6 @@ static __u32 blocking_pool_data[OUTPUT_P |
| static struct entropy_store input_pool = { |
| .poolinfo = &poolinfo_table[0], |
| .name = "input", |
| - .limit = 1, |
| .lock = __SPIN_LOCK_UNLOCKED(input_pool.lock), |
| .pool = input_pool_data |
| }; |
| @@ -504,7 +502,6 @@ static struct entropy_store input_pool = |
| static struct entropy_store blocking_pool = { |
| .poolinfo = &poolinfo_table[1], |
| .name = "blocking", |
| - .limit = 1, |
| .pull = &input_pool, |
| .lock = __SPIN_LOCK_UNLOCKED(blocking_pool.lock), |
| .pool = blocking_pool_data, |
| @@ -1280,15 +1277,6 @@ static void xfer_secondary_pool(struct e |
| r->entropy_count > r->poolinfo->poolfracbits) |
| return; |
| |
| - if (r->limit == 0 && random_min_urandom_seed) { |
| - unsigned long now = jiffies; |
| - |
| - if (time_before(now, |
| - r->last_pulled + random_min_urandom_seed * HZ)) |
| - return; |
| - r->last_pulled = now; |
| - } |
| - |
| _xfer_secondary_pool(r, nbytes); |
| } |
| |
| @@ -1296,8 +1284,6 @@ static void _xfer_secondary_pool(struct |
| { |
| __u32 tmp[OUTPUT_POOL_WORDS]; |
| |
| - /* For /dev/random's pool, always leave two wakeups' worth */ |
| - int rsvd_bytes = r->limit ? 0 : random_read_wakeup_bits / 4; |
| int bytes = nbytes; |
| |
| /* pull at least as much as a wakeup */ |
| @@ -1308,7 +1294,7 @@ static void _xfer_secondary_pool(struct |
| trace_xfer_secondary_pool(r->name, bytes * 8, nbytes * 8, |
| ENTROPY_BITS(r), ENTROPY_BITS(r->pull)); |
| bytes = extract_entropy(r->pull, tmp, bytes, |
| - random_read_wakeup_bits / 8, rsvd_bytes); |
| + random_read_wakeup_bits / 8, 0); |
| mix_pool_bytes(r, tmp, bytes); |
| credit_entropy_bits(r, bytes*8); |
| } |
| @@ -1336,7 +1322,7 @@ static void push_to_pool(struct work_str |
| static size_t account(struct entropy_store *r, size_t nbytes, int min, |
| int reserved) |
| { |
| - int entropy_count, orig; |
| + int entropy_count, orig, have_bytes; |
| size_t ibytes, nfrac; |
| |
| BUG_ON(r->entropy_count > r->poolinfo->poolfracbits); |
| @@ -1345,14 +1331,12 @@ static size_t account(struct entropy_sto |
| retry: |
| entropy_count = orig = ACCESS_ONCE(r->entropy_count); |
| ibytes = nbytes; |
| - /* If limited, never pull more than available */ |
| - if (r->limit) { |
| - int have_bytes = entropy_count >> (ENTROPY_SHIFT + 3); |
| - |
| - if ((have_bytes -= reserved) < 0) |
| - have_bytes = 0; |
| - ibytes = min_t(size_t, ibytes, have_bytes); |
| - } |
| + /* never pull more than available */ |
| + have_bytes = entropy_count >> (ENTROPY_SHIFT + 3); |
| + |
| + if ((have_bytes -= reserved) < 0) |
| + have_bytes = 0; |
| + ibytes = min_t(size_t, ibytes, have_bytes); |
| if (ibytes < min) |
| ibytes = 0; |
| |