mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-02 15:18:19 +00:00
random: make consistent usage of crng_ready()
Rather than sometimes checking `crng_init < 2`, we should always use the crng_ready() macro, so that should we change anything later, it's consistent. Additionally, that macro already has a likely() around it, which means we don't need to open code our own likely() and unlikely() annotations. Cc: Theodore Ts'o <tytso@mit.edu> Reviewed-by: Dominik Brodowski <linux@dominikbrodowski.net> Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
parent
f5eab0e2db
commit
a96cfe2d42
1 changed files with 7 additions and 12 deletions
|
@ -122,18 +122,13 @@ static void try_to_generate_entropy(void);
|
||||||
*/
|
*/
|
||||||
int wait_for_random_bytes(void)
|
int wait_for_random_bytes(void)
|
||||||
{
|
{
|
||||||
if (likely(crng_ready()))
|
while (!crng_ready()) {
|
||||||
return 0;
|
|
||||||
|
|
||||||
do {
|
|
||||||
int ret;
|
int ret;
|
||||||
ret = wait_event_interruptible_timeout(crng_init_wait, crng_ready(), HZ);
|
ret = wait_event_interruptible_timeout(crng_init_wait, crng_ready(), HZ);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret > 0 ? 0 : ret;
|
return ret > 0 ? 0 : ret;
|
||||||
|
|
||||||
try_to_generate_entropy();
|
try_to_generate_entropy();
|
||||||
} while (!crng_ready());
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(wait_for_random_bytes);
|
EXPORT_SYMBOL(wait_for_random_bytes);
|
||||||
|
@ -288,7 +283,7 @@ static void crng_reseed(bool force)
|
||||||
++next_gen;
|
++next_gen;
|
||||||
WRITE_ONCE(base_crng.generation, next_gen);
|
WRITE_ONCE(base_crng.generation, next_gen);
|
||||||
WRITE_ONCE(base_crng.birth, jiffies);
|
WRITE_ONCE(base_crng.birth, jiffies);
|
||||||
if (crng_init < 2) {
|
if (!crng_ready()) {
|
||||||
crng_init = 2;
|
crng_init = 2;
|
||||||
finalize_init = true;
|
finalize_init = true;
|
||||||
}
|
}
|
||||||
|
@ -351,7 +346,7 @@ static void crng_make_state(u32 chacha_state[CHACHA_STATE_WORDS],
|
||||||
* ready, we do fast key erasure with the base_crng directly, because
|
* ready, we do fast key erasure with the base_crng directly, because
|
||||||
* this is what crng_pre_init_inject() mutates during early init.
|
* this is what crng_pre_init_inject() mutates during early init.
|
||||||
*/
|
*/
|
||||||
if (unlikely(!crng_ready())) {
|
if (!crng_ready()) {
|
||||||
bool ready;
|
bool ready;
|
||||||
|
|
||||||
spin_lock_irqsave(&base_crng.lock, flags);
|
spin_lock_irqsave(&base_crng.lock, flags);
|
||||||
|
@ -794,7 +789,7 @@ static void credit_entropy_bits(size_t nbits)
|
||||||
entropy_count = min_t(unsigned int, POOL_BITS, orig + add);
|
entropy_count = min_t(unsigned int, POOL_BITS, orig + add);
|
||||||
} while (cmpxchg(&input_pool.entropy_count, orig, entropy_count) != orig);
|
} while (cmpxchg(&input_pool.entropy_count, orig, entropy_count) != orig);
|
||||||
|
|
||||||
if (crng_init < 2 && entropy_count >= POOL_MIN_BITS)
|
if (!crng_ready() && entropy_count >= POOL_MIN_BITS)
|
||||||
crng_reseed(false);
|
crng_reseed(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -956,7 +951,7 @@ int __init rand_initialize(void)
|
||||||
extract_entropy(base_crng.key, sizeof(base_crng.key));
|
extract_entropy(base_crng.key, sizeof(base_crng.key));
|
||||||
++base_crng.generation;
|
++base_crng.generation;
|
||||||
|
|
||||||
if (arch_init && trust_cpu && crng_init < 2) {
|
if (arch_init && trust_cpu && !crng_ready()) {
|
||||||
crng_init = 2;
|
crng_init = 2;
|
||||||
pr_notice("crng init done (trusting CPU's manufacturer)\n");
|
pr_notice("crng init done (trusting CPU's manufacturer)\n");
|
||||||
}
|
}
|
||||||
|
@ -1558,7 +1553,7 @@ static long random_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
|
||||||
case RNDRESEEDCRNG:
|
case RNDRESEEDCRNG:
|
||||||
if (!capable(CAP_SYS_ADMIN))
|
if (!capable(CAP_SYS_ADMIN))
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
if (crng_init < 2)
|
if (!crng_ready())
|
||||||
return -ENODATA;
|
return -ENODATA;
|
||||||
crng_reseed(false);
|
crng_reseed(false);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in a new issue