Skip to content

Commit 03a3bb7

Browse files
bebarinoherbertx
authored andcommitted
hwrng: core - Freeze khwrng thread during suspend
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 <[email protected]> Cc: Duncan Laurie <[email protected]> Cc: Jason Gunthorpe <[email protected]> Cc: Arnd Bergmann <[email protected]> Cc: Greg Kroah-Hartman <[email protected]> Cc: Guenter Roeck <[email protected]> Cc: Alexander Steffen <[email protected]> Signed-off-by: Stephen Boyd <[email protected]> Signed-off-by: Herbert Xu <[email protected]>
1 parent c9fbcf6 commit 03a3bb7

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

drivers/char/hw_random/core.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <linux/delay.h>
1414
#include <linux/device.h>
1515
#include <linux/err.h>
16+
#include <linux/freezer.h>
1617
#include <linux/fs.h>
1718
#include <linux/hw_random.h>
1819
#include <linux/kernel.h>
@@ -421,7 +422,9 @@ static int hwrng_fillfn(void *unused)
421422
{
422423
long rc;
423424

424-
while (!kthread_should_stop()) {
425+
set_freezable();
426+
427+
while (!kthread_freezable_should_stop(NULL)) {
425428
struct hwrng *rng;
426429

427430
rng = get_current_rng();

0 commit comments

Comments
 (0)