diff --git a/drivers/char/random.c b/drivers/char/random.c --- a/drivers/char/random.c +++ b/drivers/char/random.c @@ -1057,9 +1057,10 @@ static void _extract_crng(struct crng_state *crng, (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); + if (!arch_get_random_long(&v)) + v = random_get_entropy(); spin_lock_irqsave(&crng->lock, flags); - if (arch_get_random_long(&v)) - crng->state[14] ^= v; + crng->state[14] += v; chacha20_block(&crng->state[0], out); if (crng->state[12] == 0) crng->state[13]++;