This reverts commit 43838a23a05f ("random: fix crng_ready() test"), which causes urandom to hang in early boot even when crng_init==1.
One impact of this hang is that it prevents display of the plymouth graphical passphrase prompt required to proceed with boot. In the absence of sources of entropy (such as a wired network adapter?), the hang is indefinite. User workarounds are to generate entropy with key presses or mouse motion, or to disable the plymouth graphical passphrase prompt by removing "splash" from the kernel command line. See: urandom hang in early boot prevents plymouth passphrase entry https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=897572 Signed-off-by: Ben Caradoc-Davies <b...@transient.nz> --- drivers/char/random.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/char/random.c b/drivers/char/random.c index cd888d4ee605..cae3249ecdef 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c @@ -428,7 +428,7 @@ struct crng_state primary_crng = { * its value (from 0->1->2). */ static int crng_init = 0; -#define crng_ready() (likely(crng_init > 1)) +#define crng_ready() (likely(crng_init > 0)) static int crng_init_cnt = 0; static unsigned long crng_global_init_time = 0; #define CRNG_INIT_CNT_THRESH (2*CHACHA20_KEY_SIZE) @@ -843,7 +843,7 @@ static int crng_fast_load(const char *cp, size_t len) if (!spin_trylock_irqsave(&primary_crng.lock, flags)) return 0; - if (crng_init != 0) { + if (crng_ready()) { spin_unlock_irqrestore(&primary_crng.lock, flags); return 0; } @@ -963,7 +963,7 @@ static void _extract_crng(struct crng_state *crng, { unsigned long v, flags; - if (crng_ready() && + if (crng_init > 1 && (time_after(crng_global_init_time, crng->init_time) || time_after(jiffies, crng->init_time + CRNG_RESEED_INTERVAL))) crng_reseed(crng, crng == &primary_crng ? &input_pool : NULL); @@ -1245,7 +1245,7 @@ void add_interrupt_randomness(int irq, int irq_flags) fast_mix(fast_pool); add_interrupt_bench(cycles); - if (unlikely(crng_init == 0)) { + if (!crng_ready()) { if ((fast_pool->count >= 64) && crng_fast_load((char *) fast_pool->pool, sizeof(fast_pool->pool))) { @@ -2314,7 +2314,7 @@ void add_hwgenerator_randomness(const char *buffer, size_t count, { struct entropy_store *poolp = &input_pool; - if (unlikely(crng_init == 0)) { + if (!crng_ready()) { crng_fast_load(buffer, count); return; } -- Ben Caradoc-Davies <b...@transient.nz> Director Transient Software Limited <https://transient.nz/> New Zealand