Re: [PATCH v5] hwrng: core - Stop/start hwrng_fillfn() kthread before/after suspend-resume

From: Herbert Xu

Date: Fri Aug 14 2026 - 21:28:57 EST


On Tue, Aug 04, 2026 at 12:01:09PM +0200, Thomas Richard (TI) wrote:
> The hwrng_fillfn() kernel thread accesses the RNG device directly. During
> suspend and resume sequences, hwrng_fillfn() may attempt to access the RNG
> device while it is suspended. To address this, the hwrng_fillfn() kernel
> thread is stopped before suspend, and restarted after resume. This is done
> using the pm_notifier mechanism.
>
> Issue was found while doing suspend-to-ram on J721S2 EVM board with
> omap-rng driver.
>
> echo mem > /sys/power/state
> [ 27.922259] PM: suspend entry (deep)
> [ 27.927191] Filesystems sync: 0.000 seconds
> [ 27.933858] Freezing user space processes
> [ 27.939119] Freezing user space processes completed (elapsed 0.001 seconds)
> [ 27.946090] OOM killer disabled.
> [ 27.949315] Freezing remaining freezable tasks
> [ 27.954887] Freezing remaining freezable tasks completed (elapsed 0.001 seconds)
> [ 27.963337] GFP mask restricted
> [ 27.967069] omap_rng 4e10000.rng: PM: calling platform_pm_suspend @ 195, parent: 4e00000.crypto
> [ 27.967072] mmcblk mmc1:9fb0: PM: calling mmc_bus_suspend @ 122, parent: mmc1
> [ 27.968636] mmcblk mmc1:9fb0: PM: mmc_bus_suspend returned 0 after 1546 usecs
> [ 27.975778] omap_rng 4e10000.rng: PM: platform_pm_suspend returned 0 after 3 usecs
> ...
> [ 33.510667] ti-sci 44083000.system-controller: PM: ti_sci_suspend_noirq returned 0 after 0 usecs
> [ 33.510671] SError Interrupt on CPU0, code 0x00000000bf000000 -- SError
> [ 33.510681] CPU: 0 UID: 0 PID: 132 Comm: hwrng Tainted: G M W 7.0.0-12695-g8923b7a6e11d #19 PREEMPT
> [ 33.510690] Tainted: [M]=MACHINE_CHECK, [W]=WARN
> [ 33.510693] Hardware name: Texas Instruments J721S2 EVM (DT)
> [ 33.510697] pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
> [ 33.510701] pc : omap_rng_do_read+0x3c/0xe0
> [ 33.510709] lr : omap_rng_do_read+0x58/0xe0
> [ 33.510712] sp : ffff80008942be00
> [ 33.510713] x29: ffff80008942be00 x28: 0000000000000000 x27: 0000000000000000
> [ 33.510719] x26: 0000000000000010 x25: 0000000000000010 x24: ffff0008065644e8
> [ 33.510724] x23: ffff8000878b3370 x22: ffff00080148b2c0 x21: 0000000000000000
> [ 33.510728] x20: ffff000806564480 x19: 0000000000000064 x18: 0000000000000000
> [ 33.510732] x17: 6573752031207265 x16: 7466612030206465 x15: 6e72757465722071
> [ 33.510737] x14: ffff0008062c8080 x13: 000031702bc0da42 x12: 0000000000000001
> [ 33.510741] x11: 00000000000000c0 x10: 0000000000000b30 x9 : ffff80008942bc80
> [ 33.510745] x8 : ffff0008062c8b90 x7 : ffff000b7dfa34c0 x6 : 0000000805ca16c1
> [ 33.510749] x5 : 0000000000000000 x4 : ffff800080e17bfc x3 : ffff800087389c68
> [ 33.510753] x2 : 0000000000000000 x1 : 0000000000000010 x0 : 000000000000a7c6
> [ 33.510759] Kernel panic - not syncing: Asynchronous SError Interrupt
> [ 33.510762] CPU: 0 UID: 0 PID: 132 Comm: hwrng Tainted: G M W 7.0.0-12695-g8923b7a6e11d #19 PREEMPT
> [ 33.510767] Tainted: [M]=MACHINE_CHECK, [W]=WARN
> [ 33.510768] Hardware name: Texas Instruments J721S2 EVM (DT)
> [ 33.510770] Call trace:
> [ 33.510772] show_stack+0x18/0x24 (C)
> [ 33.510780] dump_stack_lvl+0x34/0x8c
> [ 33.510788] dump_stack+0x18/0x24
> [ 33.510792] vpanic+0x47c/0x4dc
> [ 33.510799] do_panic_on_target_cpu+0x0/0x1c
> [ 33.510803] add_taint+0x0/0xbc
> [ 33.510807] arm64_serror_panic+0x70/0x80
> [ 33.510812] do_serror+0x3c/0x70
> [ 33.510815] el1h_64_error_handler+0x34/0x50
> [ 33.510823] el1h_64_error+0x6c/0x70
> [ 33.510827] omap_rng_do_read+0x3c/0xe0 (P)
> [ 33.510831] hwrng_fillfn+0x98/0x330
> [ 33.510834] kthread+0x130/0x13c
> [ 33.510845] ret_from_fork+0x10/0x20
> [ 33.510850] SMP: stopping secondary CPUs
> [ 33.519442] Kernel Offset: disabled
> [ 33.519444] CPU features: 0x04000000,800a0008,00040001,0400421b
> [ 33.519448] Memory Limit: none
> [ 33.732904] ---[ end Kernel panic - not syncing: Asynchronous SError Interrupt ]---
>
> Signed-off-by: Thomas Richard (TI) <thomas.richard@xxxxxxxxxxx>
> ---
> In this fifth iteration, after the PM notifier stops the hwrng_fillfn()
> kthread, release the mutex so userspace can set a RNG device or read data
> before the kernel freezes all threads. Add a hwrng_fillfn_stopped flag to
> prevent the hwrng_fillfn() kthread from restarting after being stopped by
> the PM notifier and before threads freezing completes.
> ---
> Changes in v5:
> - release rng_mutex once hwrng_fillfn() kthread is stopped
> - add hwrng_fillfn_stopped flag to prevent hwrng_fillfn() kthread restarting
> - Link to v4: https://lore.kernel.org/r/20260713-hw-random-fix-hwrng-fillfn-crash-suspend-resume-v4-1-b5fb4c520b05@xxxxxxxxxxx
>
> Changes in v4:
> - use lockdep_assert_held() instead of BUG_ON()
> - Link to v3: https://lore.kernel.org/r/20260703-hw-random-fix-hwrng-fillfn-crash-suspend-resume-v3-1-b7165cb9cf38@xxxxxxxxxxx
>
> Changes in v3:
> - use pm_notifier to stop/start the hwrng_fillfn() kthread before/after
> suspend-resume.
> - Link to v2: https://lore.kernel.org/r/20260601-hw-random-fix-hwrng-fillfn-crash-suspend-resume-v2-1-667ce5da32ee@xxxxxxxxxxx
>
> Changes in v2:
> - Initialize rc variable.
> - Link to v1: https://lore.kernel.org/r/20260513-hw-random-fix-hwrng-fillfn-crash-suspend-resume-v1-1-b12551c1c7dd@xxxxxxxxxxx
>
> To: Olivia Mackall <olivia@xxxxxxxxxxx>
> To: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx>
> Cc: Thomas Petazzoni <thomas.petazzoni@xxxxxxxxxxx>
> Cc: linux-crypto@xxxxxxxxxxxxxxx
> Cc: linux-kernel@xxxxxxxxxxxxxxx
> ---
> drivers/char/hw_random/core.c | 101 +++++++++++++++++++++++++++++++++++-------
> 1 file changed, 86 insertions(+), 15 deletions(-)

Patch applied. Thanks.
--
Email: Herbert Xu <herbert@xxxxxxxxxxxxxxxxxxx>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt