hwrng: core - start and stop in-kernel rngd in separate function
authorDominik Brodowski <linux@dominikbrodowski.net>
Sun, 13 Feb 2022 20:46:29 +0000 (21:46 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 18 Feb 2022 05:21:10 +0000 (16:21 +1100)
Extract the start/stop logic for the in-kernel rngd thread to
a separate function.

Cc: Herbert Xu <herbert@gondor.apana.org.au>
Cc: Jason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/char/hw_random/core.c

index 6f09f4e..29febf5 100644 (file)
@@ -51,7 +51,7 @@ MODULE_PARM_DESC(default_quality,
 
 static void drop_current_rng(void);
 static int hwrng_init(struct hwrng *rng);
-static void start_khwrngd(void);
+static void hwrng_manage_rngd(void);
 
 static inline int rng_get_data(struct hwrng *rng, u8 *buffer, size_t size,
                               int wait);
@@ -164,10 +164,7 @@ skip_init:
        if (current_quality > 1024)
                current_quality = 1024;
 
-       if (current_quality == 0 && hwrng_fill)
-               kthread_stop(hwrng_fill);
-       if (current_quality > 0 && !hwrng_fill)
-               start_khwrngd();
+       hwrng_manage_rngd();
 
        return 0;
 }
@@ -466,12 +463,19 @@ static int hwrng_fillfn(void *unused)
        return 0;
 }
 
-static void start_khwrngd(void)
+static void hwrng_manage_rngd(void)
 {
-       hwrng_fill = kthread_run(hwrng_fillfn, NULL, "hwrng");
-       if (IS_ERR(hwrng_fill)) {
-               pr_err("hwrng_fill thread creation failed\n");
-               hwrng_fill = NULL;
+       if (WARN_ON(!mutex_is_locked(&rng_mutex)))
+               return;
+
+       if (current_quality == 0 && hwrng_fill)
+               kthread_stop(hwrng_fill);
+       if (current_quality > 0 && !hwrng_fill) {
+               hwrng_fill = kthread_run(hwrng_fillfn, NULL, "hwrng");
+               if (IS_ERR(hwrng_fill)) {
+                       pr_err("hwrng_fill thread creation failed\n");
+                       hwrng_fill = NULL;
+               }
        }
 }