lkml.org 
[lkml]   [2022]   [Jun]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 069/234] random: cleanup fractional entropy shift constants
    Date
    From: "Jason A. Donenfeld" <Jason@zx2c4.com>

    commit 18263c4e8e62f7329f38f5eadc568751242ca89c 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>
    ---
    drivers/char/random.c | 28 +++++++++++++---------------
    1 file changed, 13 insertions(+), 15 deletions(-)

    --- a/drivers/char/random.c
    +++ b/drivers/char/random.c
    @@ -359,16 +359,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
    * access to /dev/random.
    @@ -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,
    @@ -652,6 +647,9 @@ static void credit_entropy_bits(int nbit
    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;

    @@ -687,13 +685,13 @@ retry:
    /* 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)) {

    \
     
     \ /
      Last update: 2022-06-23 20:02    [W:5.149 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site