| From foo@baz Thu Jun 16 06:59:24 PM CEST 2022 |
| From: "Jason A. Donenfeld" <Jason@zx2c4.com> |
| Date: Tue, 8 Feb 2022 12:40:14 +0100 |
| Subject: random: inline leaves of rand_initialize() |
| |
| 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 |
| @@ -477,42 +477,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 |
| @@ -1272,17 +1236,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)); |
| @@ -1293,22 +1268,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; |