lkml.org 
[lkml]   [2022]   [Jun]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 136/240] timekeeping: Add raw clock fallback for random_get_entropy()
    Date
    From: "Jason A. Donenfeld" <Jason@zx2c4.com>

    commit 1366992e16bddd5e2d9a561687f367f9f802e2e4 upstream.

    The addition of random_get_entropy_fallback() provides access to
    whichever time source has the highest frequency, which is useful for
    gathering entropy on platforms without available cycle counters. It's
    not necessarily as good as being able to quickly access a cycle counter
    that the CPU has, but it's still something, even when it falls back to
    being jiffies-based.

    In the event that a given arch does not define get_cycles(), falling
    back to the get_cycles() default implementation that returns 0 is really
    not the best we can do. Instead, at least calling
    random_get_entropy_fallback() would be preferable, because that always
    needs to return _something_, even falling back to jiffies eventually.
    It's not as though random_get_entropy_fallback() is super high precision
    or guaranteed to be entropic, but basically anything that's not zero all
    the time is better than returning zero all the time.

    Finally, since random_get_entropy_fallback() is used during extremely
    early boot when randomizing freelists in mm_init(), it can be called
    before timekeeping has been initialized. In that case there really is
    nothing we can do; jiffies hasn't even started ticking yet. So just give
    up and return 0.

    Suggested-by: Thomas Gleixner <tglx@linutronix.de>
    Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
    Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Cc: Theodore Ts'o <tytso@mit.edu>
    Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    include/linux/timex.h | 8 ++++++++
    kernel/time/timekeeping.c | 15 +++++++++++++++
    2 files changed, 23 insertions(+)

    --- a/include/linux/timex.h
    +++ b/include/linux/timex.h
    @@ -62,6 +62,8 @@
    #include <linux/types.h>
    #include <linux/param.h>

    +unsigned long random_get_entropy_fallback(void);
    +
    #include <asm/timex.h>

    #ifndef random_get_entropy
    @@ -74,8 +76,14 @@
    *
    * By default we use get_cycles() for this purpose, but individual
    * architectures may override this in their asm/timex.h header file.
    + * If a given arch does not have get_cycles(), then we fallback to
    + * using random_get_entropy_fallback().
    */
    +#ifdef get_cycles
    #define random_get_entropy() ((unsigned long)get_cycles())
    +#else
    +#define random_get_entropy() random_get_entropy_fallback()
    +#endif
    #endif

    /*
    --- a/kernel/time/timekeeping.c
    +++ b/kernel/time/timekeeping.c
    @@ -17,6 +17,7 @@
    #include <linux/clocksource.h>
    #include <linux/jiffies.h>
    #include <linux/time.h>
    +#include <linux/timex.h>
    #include <linux/tick.h>
    #include <linux/stop_machine.h>
    #include <linux/pvclock_gtod.h>
    @@ -2304,6 +2305,20 @@ static int timekeeping_validate_timex(co
    return 0;
    }

    +/**
    + * random_get_entropy_fallback - Returns the raw clock source value,
    + * used by random.c for platforms with no valid random_get_entropy().
    + */
    +unsigned long random_get_entropy_fallback(void)
    +{
    + struct tk_read_base *tkr = &tk_core.timekeeper.tkr_mono;
    + struct clocksource *clock = READ_ONCE(tkr->clock);
    +
    + if (unlikely(timekeeping_suspended || !clock))
    + return 0;
    + return clock->read(clock);
    +}
    +EXPORT_SYMBOL_GPL(random_get_entropy_fallback);

    /**
    * do_adjtimex() - Accessor function to NTP __do_adjtimex function

    \
     
     \ /
      Last update: 2022-06-20 15:52    [W:4.322 / U:0.072 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site