Skip to content

Commit 5cbe0f1

Browse files
mrutland-armtytso
authored andcommitted
random: split primary/secondary crng init paths
Currently crng_initialize() is used for both the primary CRNG and secondary CRNGs. While we wish to share common logic, we need to do a number of additional things for the primary CRNG, and this would be easier to deal with were these handled in separate functions. This patch splits crng_initialize() into crng_initialize_primary() and crng_initialize_secondary(), with common logic factored out into a crng_init_try_arch() helper. There should be no functional change as a result of this patch. Signed-off-by: Mark Rutland <[email protected]> Cc: Mark Brown <[email protected]> Cc: Theodore Ts'o <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Theodore Ts'o <[email protected]>
1 parent f8788d8 commit 5cbe0f1

File tree

1 file changed

+22
-12
lines changed

1 file changed

+22
-12
lines changed

drivers/char/random.c

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -781,27 +781,37 @@ static int __init parse_trust_cpu(char *arg)
781781
}
782782
early_param("random.trust_cpu", parse_trust_cpu);
783783

784-
static void crng_initialize(struct crng_state *crng)
784+
static bool crng_init_try_arch(struct crng_state *crng)
785785
{
786786
int i;
787-
int arch_init = 1;
787+
bool arch_init = true;
788788
unsigned long rv;
789789

790-
memcpy(&crng->state[0], "expand 32-byte k", 16);
791-
if (crng == &primary_crng)
792-
_extract_entropy(&input_pool, &crng->state[4],
793-
sizeof(__u32) * 12, 0);
794-
else
795-
_get_random_bytes(&crng->state[4], sizeof(__u32) * 12);
796790
for (i = 4; i < 16; i++) {
797791
if (!arch_get_random_seed_long(&rv) &&
798792
!arch_get_random_long(&rv)) {
799793
rv = random_get_entropy();
800-
arch_init = 0;
794+
arch_init = false;
801795
}
802796
crng->state[i] ^= rv;
803797
}
804-
if (trust_cpu && arch_init && crng == &primary_crng) {
798+
799+
return arch_init;
800+
}
801+
802+
static void crng_initialize_secondary(struct crng_state *crng)
803+
{
804+
memcpy(&crng->state[0], "expand 32-byte k", 16);
805+
_get_random_bytes(&crng->state[4], sizeof(__u32) * 12);
806+
crng_init_try_arch(crng);
807+
crng->init_time = jiffies - CRNG_RESEED_INTERVAL - 1;
808+
}
809+
810+
static void __init crng_initialize_primary(struct crng_state *crng)
811+
{
812+
memcpy(&crng->state[0], "expand 32-byte k", 16);
813+
_extract_entropy(&input_pool, &crng->state[4], sizeof(__u32) * 12, 0);
814+
if (crng_init_try_arch(crng) && trust_cpu) {
805815
invalidate_batched_entropy();
806816
numa_crng_init();
807817
crng_init = 2;
@@ -822,7 +832,7 @@ static void do_numa_crng_init(struct work_struct *work)
822832
crng = kmalloc_node(sizeof(struct crng_state),
823833
GFP_KERNEL | __GFP_NOFAIL, i);
824834
spin_lock_init(&crng->lock);
825-
crng_initialize(crng);
835+
crng_initialize_secondary(crng);
826836
pool[i] = crng;
827837
}
828838
mb();
@@ -1771,7 +1781,7 @@ static void __init init_std_data(struct entropy_store *r)
17711781
int __init rand_initialize(void)
17721782
{
17731783
init_std_data(&input_pool);
1774-
crng_initialize(&primary_crng);
1784+
crng_initialize_primary(&primary_crng);
17751785
crng_global_init_time = jiffies;
17761786
if (ratelimit_disable) {
17771787
urandom_warning.interval = 0;

0 commit comments

Comments
 (0)