diff options
author | Dominik Brodowski <linux@dominikbrodowski.net> | 2022-02-13 21:46:29 +0100 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2022-02-18 06:21:10 +0100 |
commit | 077bb7a1baec75bd2d7d08e2cbdeb5b72344a4ad (patch) | |
tree | 86e7a69eb1af0bd65c9e7f211836e66003950205 /drivers | |
parent | hwrng: core - do not bother to order list of devices by quality (diff) | |
download | linux-077bb7a1baec75bd2d7d08e2cbdeb5b72344a4ad.tar.xz linux-077bb7a1baec75bd2d7d08e2cbdeb5b72344a4ad.zip |
hwrng: core - start and stop in-kernel rngd in separate function
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>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/char/hw_random/core.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/drivers/char/hw_random/core.c b/drivers/char/hw_random/core.c index 6f09f4e5af20..29febf55b0d4 100644 --- a/drivers/char/hw_random/core.c +++ b/drivers/char/hw_random/core.c @@ -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; + } } } |