Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6bc282be authored by Jason A. Donenfeld's avatar Jason A. Donenfeld Committed by Greg Kroah-Hartman
Browse files

random: inline leaves of rand_initialize()



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: default avatarDominik Brodowski <linux@dominikbrodowski.net>
Reviewed-by: default avatarEric Biggers <ebiggers@google.com>
Signed-off-by: default avatarJason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent a07ddc05
Loading
Loading
Loading
Loading
+33 −57
Original line number Diff line number Diff line
@@ -477,42 +477,6 @@ static DECLARE_WAIT_QUEUE_HEAD(crng_init_wait);

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(void *buf, int nbytes)
}
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())));

	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;

/*
 * 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();
	if (ratelimit_disable) {
		urandom_warning.interval = 0;
		unseeded_warning.interval = 0;