Skip to content

Commit

Permalink
random: cleanup fractional entropy shift constants
Browse files Browse the repository at this point in the history
commit 18263c4 upstream.

The entropy estimator is calculated in terms of 1/8 bits, which means
there are various constants where things are shifted by 3. Move these
into our pool info enum with the other relevant constants. While we're
at it, move an English assertion about sizes into a proper BUILD_BUG_ON
so that the compiler can ensure this invariant.

Reviewed-by: Dominik Brodowski <linux@dominikbrodowski.net>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
zx2c4 authored and gregkh committed May 30, 2022
1 parent edd2940 commit a9db850
Showing 1 changed file with 13 additions and 15 deletions.
28 changes: 13 additions & 15 deletions drivers/char/random.c
Original file line number Diff line number Diff line change
Expand Up @@ -358,16 +358,6 @@

/* #define ADD_INTERRUPT_BENCH */

/*
* To allow fractional bits to be tracked, the entropy_count field is
* denominated in units of 1/8th bits.
*
* 2*(POOL_ENTROPY_SHIFT + poolbitshift) must <= 31, or the multiply in
* credit_entropy_bits() needs to be 64 bits wide.
*/
#define POOL_ENTROPY_SHIFT 3
#define POOL_ENTROPY_BITS() (input_pool.entropy_count >> POOL_ENTROPY_SHIFT)

/*
* If the entropy count falls under this number of bits, then we
* should wake up processes which are selecting or polling on write
Expand Down Expand Up @@ -425,8 +415,13 @@ enum poolinfo {
POOL_WORDMASK = POOL_WORDS - 1,
POOL_BYTES = POOL_WORDS * sizeof(u32),
POOL_BITS = POOL_BYTES * 8,
POOL_BITSHIFT = ilog2(POOL_WORDS) + 5,
POOL_FRACBITS = POOL_WORDS << (POOL_ENTROPY_SHIFT + 5),
POOL_BITSHIFT = ilog2(POOL_BITS),

/* To allow fractional bits to be tracked, the entropy_count field is
* denominated in units of 1/8th bits. */
POOL_ENTROPY_SHIFT = 3,
#define POOL_ENTROPY_BITS() (input_pool.entropy_count >> POOL_ENTROPY_SHIFT)
POOL_FRACBITS = POOL_BITS << POOL_ENTROPY_SHIFT,

/* x^128 + x^104 + x^76 + x^51 +x^25 + x + 1 */
POOL_TAP1 = 104,
Expand Down Expand Up @@ -652,6 +647,9 @@ static void credit_entropy_bits(int nbits)
int entropy_count, entropy_bits, orig;
int nfrac = nbits << POOL_ENTROPY_SHIFT;

/* Ensure that the multiplication can avoid being 64 bits wide. */
BUILD_BUG_ON(2 * (POOL_ENTROPY_SHIFT + POOL_BITSHIFT) > 31);

if (!nbits)
return;

Expand Down Expand Up @@ -687,13 +685,13 @@ static void credit_entropy_bits(int nbits)
/* The +2 corresponds to the /4 in the denominator */

do {
unsigned int anfrac = min(pnfrac, POOL_FRACBITS/2);
unsigned int anfrac = min(pnfrac, POOL_FRACBITS / 2);
unsigned int add =
((POOL_FRACBITS - entropy_count)*anfrac*3) >> s;
((POOL_FRACBITS - entropy_count) * anfrac * 3) >> s;

entropy_count += add;
pnfrac -= anfrac;
} while (unlikely(entropy_count < POOL_FRACBITS-2 && pnfrac));
} while (unlikely(entropy_count < POOL_FRACBITS - 2 && pnfrac));
}

if (WARN_ON(entropy_count < 0)) {
Expand Down

0 comments on commit a9db850

Please sign in to comment.