lkml.org 
[lkml]   [2019]   [Aug]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3] hwrng: core: Freeze khwrng thread during suspend
    Date
    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>
    ---

    I'm splitting this patch off of the larger series so it can
    go through the crypto tree. See [1] for the prevoius round.
    Nothing has changed in this patch since then.

    [1] https://lkml.kernel.org/r/20190716224518.62556-2-swboyd@chromium.org

    drivers/char/hw_random/core.c | 5 ++++-
    1 file changed, 4 insertions(+), 1 deletion(-)

    diff --git a/drivers/char/hw_random/core.c b/drivers/char/hw_random/core.c
    index 95be7228f327..3b88af3149a7 100644
    --- a/drivers/char/hw_random/core.c
    +++ b/drivers/char/hw_random/core.c
    @@ -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();
    --
    Sent by a computer through tubes
    \
     
     \ /
      Last update: 2019-08-06 01:33    [W:5.364 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site