hwrng: core - Freeze khwrng thread during suspend
authorStephen Boyd <swboyd@chromium.org>
Mon, 5 Aug 2019 23:32:41 +0000 (16:32 -0700)
committerHerbert Xu <herbert@gondor.apana.org.au>
Thu, 15 Aug 2019 11:52:13 +0000 (21:52 +1000)
The hwrng_fill() function can run while devices are suspending and
resuming. If the hwrng is behind a bus such as i2c or SPI and that bus
is suspended, the hwrng may hang the bus while attempting to add some
randomness. It's been observed on ChromeOS devices with suspend-to-idle
(s2idle) and an i2c based hwrng that this kthread may run and ask the
hwrng device for randomness before the i2c bus has been resumed.

Let's make this kthread freezable so that we don't try to touch the
hwrng during suspend/resume. This ensures that we can't cause the hwrng
backing driver to get into a bad state because the device is guaranteed
to be resumed before the hwrng kthread is thawed.

Cc: Andrey Pronin <apronin@chromium.org>
Cc: Duncan Laurie <dlaurie@chromium.org>
Cc: Jason Gunthorpe <jgg@ziepe.ca>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Guenter Roeck <groeck@chromium.org>
Cc: Alexander Steffen <Alexander.Steffen@infineon.com>
Signed-off-by: Stephen Boyd <swboyd@chromium.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/char/hw_random/core.c

index 9044d31ab1a19cef76b2aa7fafc620ffdd0206c4..bdab5d9af8d219896a22879f3edfcee5ca08b4eb 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/delay.h>
 #include <linux/device.h>
 #include <linux/err.h>
+#include <linux/freezer.h>
 #include <linux/fs.h>
 #include <linux/hw_random.h>
 #include <linux/kernel.h>
@@ -421,7 +422,9 @@ static int hwrng_fillfn(void *unused)
 {
        long rc;
 
-       while (!kthread_should_stop()) {
+       set_freezable();
+
+       while (!kthread_freezable_should_stop(NULL)) {
                struct hwrng *rng;
 
                rng = get_current_rng();