lkml.org 
[lkml]   [2022]   [Jun]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 075/240] random: inline leaves of rand_initialize()
    Date
    From: "Jason A. Donenfeld" <Jason@zx2c4.com>

    commit 8566417221fcec51346ec164e920dacb979c6b5f upstream.

    This is a preparatory commit for the following one. We simply inline the
    various functions that rand_initialize() calls that have no other
    callers. The compiler was doing this anyway before. Doing this will
    allow us to reorganize this after. We can then move the trust_cpu and
    parse_trust_cpu definitions a bit closer to where they're actually used,
    which makes the code easier to read.

    Cc: Theodore Ts'o <tytso@mit.edu>
    Reviewed-by: Dominik Brodowski <linux@dominikbrodowski.net>
    Reviewed-by: Eric Biggers <ebiggers@google.com>
    Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/char/random.c | 90 ++++++++++++++++++--------------------------------
    1 file changed, 33 insertions(+), 57 deletions(-)

    --- a/drivers/char/random.c
    +++ b/drivers/char/random.c
    @@ -476,42 +476,6 @@ static DECLARE_WAIT_QUEUE_HEAD(crng_init

    static void invalidate_batched_entropy(void);

    -static bool trust_cpu __ro_after_init = IS_ENABLED(CONFIG_RANDOM_TRUST_CPU);
    -static int __init parse_trust_cpu(char *arg)
    -{
    - return kstrtobool(arg, &trust_cpu);
    -}
    -early_param("random.trust_cpu", parse_trust_cpu);
    -
    -static bool __init crng_init_try_arch_early(void)
    -{
    - int i;
    - bool arch_init = true;
    - unsigned long rv;
    -
    - for (i = 4; i < 16; i++) {
    - if (!arch_get_random_seed_long_early(&rv) &&
    - !arch_get_random_long_early(&rv)) {
    - rv = random_get_entropy();
    - arch_init = false;
    - }
    - primary_crng.state[i] ^= rv;
    - }
    -
    - return arch_init;
    -}
    -
    -static void __init crng_initialize(void)
    -{
    - extract_entropy(&primary_crng.state[4], sizeof(u32) * 12);
    - if (crng_init_try_arch_early() && trust_cpu && crng_init < 2) {
    - invalidate_batched_entropy();
    - crng_init = 2;
    - pr_notice("crng init done (trusting CPU's manufacturer)\n");
    - }
    - primary_crng.init_time = jiffies - CRNG_RESEED_INTERVAL - 1;
    -}
    -
    /*
    * crng_fast_load() can be called by code in the interrupt service
    * path. So we can't afford to dilly-dally. Returns the number of
    @@ -1220,17 +1184,28 @@ int __must_check get_random_bytes_arch(v
    }
    EXPORT_SYMBOL(get_random_bytes_arch);

    +static bool trust_cpu __ro_after_init = IS_ENABLED(CONFIG_RANDOM_TRUST_CPU);
    +static int __init parse_trust_cpu(char *arg)
    +{
    + return kstrtobool(arg, &trust_cpu);
    +}
    +early_param("random.trust_cpu", parse_trust_cpu);
    +
    /*
    - * init_std_data - initialize pool with system data
    - *
    - * This function clears the pool's entropy count and mixes some system
    - * data into the pool to prepare it for use. The pool is not cleared
    - * as that can only decrease the entropy in the pool.
    + * Note that setup_arch() may call add_device_randomness()
    + * long before we get here. This allows seeding of the pools
    + * with some platform dependent data very early in the boot
    + * process. But it limits our options here. We must use
    + * statically allocated structures that already have all
    + * initializations complete at compile time. We should also
    + * take care not to overwrite the precious per platform data
    + * we were given.
    */
    -static void __init init_std_data(void)
    +int __init rand_initialize(void)
    {
    int i;
    ktime_t now = ktime_get_real();
    + bool arch_init = true;
    unsigned long rv;

    mix_pool_bytes(&now, sizeof(now));
    @@ -1241,22 +1216,23 @@ static void __init init_std_data(void)
    mix_pool_bytes(&rv, sizeof(rv));
    }
    mix_pool_bytes(utsname(), sizeof(*(utsname())));
    -}

    -/*
    - * Note that setup_arch() may call add_device_randomness()
    - * long before we get here. This allows seeding of the pools
    - * with some platform dependent data very early in the boot
    - * process. But it limits our options here. We must use
    - * statically allocated structures that already have all
    - * initializations complete at compile time. We should also
    - * take care not to overwrite the precious per platform data
    - * we were given.
    - */
    -int __init rand_initialize(void)
    -{
    - init_std_data();
    - crng_initialize();
    + extract_entropy(&primary_crng.state[4], sizeof(u32) * 12);
    + for (i = 4; i < 16; i++) {
    + if (!arch_get_random_seed_long_early(&rv) &&
    + !arch_get_random_long_early(&rv)) {
    + rv = random_get_entropy();
    + arch_init = false;
    + }
    + primary_crng.state[i] ^= rv;
    + }
    + if (arch_init && trust_cpu && crng_init < 2) {
    + invalidate_batched_entropy();
    + crng_init = 2;
    + pr_notice("crng init done (trusting CPU's manufacturer)\n");
    + }
    + primary_crng.init_time = jiffies - CRNG_RESEED_INTERVAL - 1;
    +
    if (ratelimit_disable) {
    urandom_warning.interval = 0;
    unseeded_warning.interval = 0;

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