]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
random: split primary/secondary crng init paths
authorMark Rutland <mark.rutland@arm.com>
Mon, 10 Feb 2020 13:00:12 +0000 (13:00 +0000)
committerTheodore Ts'o <tytso@mit.edu>
Fri, 28 Feb 2020 04:21:52 +0000 (23:21 -0500)
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 <mark.rutland@arm.com>
Cc: Mark Brown <broonie@kernel.org>
Cc: Theodore Ts'o <tytso@mit.edu>
Link: https://lore.kernel.org/r/20200210130015.17664-2-mark.rutland@arm.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
drivers/char/random.c

index c7f9584de2c8bbf57753a3eb7f6caf9324749212..62d32e62f2dae0e39d15efca06fad7a0c5f632cf 100644 (file)
@@ -781,27 +781,37 @@ static int __init parse_trust_cpu(char *arg)
 }
 early_param("random.trust_cpu", parse_trust_cpu);
 
-static void crng_initialize(struct crng_state *crng)
+static bool crng_init_try_arch(struct crng_state *crng)
 {
        int             i;
-       int             arch_init = 1;
+       bool            arch_init = true;
        unsigned long   rv;
 
-       memcpy(&crng->state[0], "expand 32-byte k", 16);
-       if (crng == &primary_crng)
-               _extract_entropy(&input_pool, &crng->state[4],
-                                sizeof(__u32) * 12, 0);
-       else
-               _get_random_bytes(&crng->state[4], sizeof(__u32) * 12);
        for (i = 4; i < 16; i++) {
                if (!arch_get_random_seed_long(&rv) &&
                    !arch_get_random_long(&rv)) {
                        rv = random_get_entropy();
-                       arch_init = 0;
+                       arch_init = false;
                }
                crng->state[i] ^= rv;
        }
-       if (trust_cpu && arch_init && crng == &primary_crng) {
+
+       return arch_init;
+}
+
+static void crng_initialize_secondary(struct crng_state *crng)
+{
+       memcpy(&crng->state[0], "expand 32-byte k", 16);
+       _get_random_bytes(&crng->state[4], sizeof(__u32) * 12);
+       crng_init_try_arch(crng);
+       crng->init_time = jiffies - CRNG_RESEED_INTERVAL - 1;
+}
+
+static void __init crng_initialize_primary(struct crng_state *crng)
+{
+       memcpy(&crng->state[0], "expand 32-byte k", 16);
+       _extract_entropy(&input_pool, &crng->state[4], sizeof(__u32) * 12, 0);
+       if (crng_init_try_arch(crng) && trust_cpu) {
                invalidate_batched_entropy();
                numa_crng_init();
                crng_init = 2;
@@ -822,7 +832,7 @@ static void do_numa_crng_init(struct work_struct *work)
                crng = kmalloc_node(sizeof(struct crng_state),
                                    GFP_KERNEL | __GFP_NOFAIL, i);
                spin_lock_init(&crng->lock);
-               crng_initialize(crng);
+               crng_initialize_secondary(crng);
                pool[i] = crng;
        }
        mb();
@@ -1771,7 +1781,7 @@ static void __init init_std_data(struct entropy_store *r)
 int __init rand_initialize(void)
 {
        init_std_data(&input_pool);
-       crng_initialize(&primary_crng);
+       crng_initialize_primary(&primary_crng);
        crng_global_init_time = jiffies;
        if (ratelimit_disable) {
                urandom_warning.interval = 0;