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 141/240] x86/tsc: Use fallback for random_get_entropy() instead of zero
    Date
    From: "Jason A. Donenfeld" <Jason@zx2c4.com>

    commit 3bd4abc07a267e6a8b33d7f8717136e18f921c53 upstream.

    In the event that random_get_entropy() can't access a cycle counter or
    similar, falling back to returning 0 is suboptimal. Instead, fallback
    to calling random_get_entropy_fallback(), which isn't extremely high
    precision or guaranteed to be entropic, but is certainly better than
    returning zero all the time.

    If CONFIG_X86_TSC=n, then it's possible for the kernel to run on systems
    without RDTSC, such as 486 and certain 586, so the fallback code is only
    required for that case.

    As well, fix up both the new function and the get_cycles() function from
    which it was derived to use cpu_feature_enabled() rather than
    boot_cpu_has(), and use !IS_ENABLED() instead of #ifndef.

    Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
    Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: x86@kernel.org
    Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/x86/include/asm/timex.h | 9 +++++++++
    arch/x86/include/asm/tsc.h | 7 +++----
    2 files changed, 12 insertions(+), 4 deletions(-)

    --- a/arch/x86/include/asm/timex.h
    +++ b/arch/x86/include/asm/timex.h
    @@ -5,6 +5,15 @@
    #include <asm/processor.h>
    #include <asm/tsc.h>

    +static inline unsigned long random_get_entropy(void)
    +{
    + if (!IS_ENABLED(CONFIG_X86_TSC) &&
    + !cpu_feature_enabled(X86_FEATURE_TSC))
    + return random_get_entropy_fallback();
    + return rdtsc();
    +}
    +#define random_get_entropy random_get_entropy
    +
    /* Assume we use the PIT time source for the clock tick */
    #define CLOCK_TICK_RATE PIT_TICK_RATE

    --- a/arch/x86/include/asm/tsc.h
    +++ b/arch/x86/include/asm/tsc.h
    @@ -22,13 +22,12 @@ extern void disable_TSC(void);

    static inline cycles_t get_cycles(void)
    {
    -#ifndef CONFIG_X86_TSC
    - if (!boot_cpu_has(X86_FEATURE_TSC))
    + if (!IS_ENABLED(CONFIG_X86_TSC) &&
    + !cpu_feature_enabled(X86_FEATURE_TSC))
    return 0;
    -#endif
    -
    return rdtsc();
    }
    +#define get_cycles get_cycles

    extern struct system_counterval_t convert_art_to_tsc(u64 art);
    extern struct system_counterval_t convert_art_ns_to_tsc(u64 art_ns);

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