[PATCH v2 00/11] archs/random: fallback to using ktime_read_raw_clock() if no cycle counter
Jason A. Donenfeld
Jason at zx2c4.com
Sun Apr 10 14:49:40 PDT 2022
Hi folks,
The RNG uses a function called random_get_entropy() basically anytime
that it needs to timestamp an event. For example, an interrupt comes in,
and we mix a random_get_entropy() into the entropy pool somehow.
Somebody mashes their keyboard or moves their mouse around? We mix a
random_get_entropy() into the entropy pool. It's one of the main
varieties of input.
Unfortunately, it's always 0 on a few platforms. The RNG has accumulated
various hacks to deal with this, but in general it's not great. Surely
we can do better than 0. In fact, *anything* that's not the same exact
value all the time would be better than 0. Even a counter that
increments once per hour would be better than 0! I think you get the
idea.
On most platforms, random_get_entropy() is aliased to get_cycles(),
which makes sense for platforms where get_cycles() is defined. RDTSC,
for example, has all the characteristics we care about for this
function: it's fast to acquire (i.e. acceptable in an irq handler),
pretty high precision, available, forms a 2-monotone distribution, etc.
But for platforms without that, what is the next best thing?
Sometimes the next best thing is architecture-defined. For example,
really old MIPS has the CP0 random register, which isn't a cycle
counter, but is at least something. However, some platforms don't even
have an architecture-defined fallback.
Fortunately, the timekeeping subsystem has already solved this problem
of trying to determine what the least bad clock is on constrained
systems, falling back to jiffies in the worst case. By exporting the raw
clock, we can get a decent fallback function for when there's no cycle
counter or architecture-specific function.
This series makes the RNG more useful on: m68k, RISC-V, MIPS, ARM32,
NIOS II, SPARC32, Xtensa, and Usermode Linux. Previously these platforms
would, in certain circumstances, but out of luck with regards to having
any type of event timestamping source in the RNG.
Finally, note that this series isn't about "jitter entropy" or other
ways of initializing the RNG. That's a different topic for a different
thread. Please don't let this discussion veer off into that. Here, I'm
just trying to find a good fallback counter/timer for platforms without
get_cycles(), a question with limited scope.
If this (or a future revision) looks good to you all and receives the
requisite acks, my plan was to take these through the random.git tree
for 5.19, so that I can then build on top of it.
Thanks,
Jason
Changes v1->v2:
- Use ktime_read_raw_clock() instead of sched_clock(), per Thomas'
suggestion.
- Drop arm64 change.
- Cleanup header inclusion ordering problem.
Cc: Thomas Gleixner <tglx at linutronix.de>
Cc: Arnd Bergmann <arnd at arndb.de>
Cc: Theodore Ts'o <tytso at mit.edu>
Cc: Dominik Brodowski <linux at dominikbrodowski.net>
Cc: Russell King <linux at armlinux.org.uk>
Cc: Catalin Marinas <catalin.marinas at arm.com>
Cc: Will Deacon <will at kernel.org>
Cc: Geert Uytterhoeven <geert at linux-m68k.org>
Cc: Thomas Bogendoerfer <tsbogend at alpha.franken.de>
Cc: Paul Walmsley <paul.walmsley at sifive.com>
Cc: Palmer Dabbelt <palmer at dabbelt.com>
Cc: Albert Ou <aou at eecs.berkeley.edu>
Cc: David S. Miller <davem at davemloft.net>
Cc: Richard Weinberger <richard at nod.at>
Cc: Anton Ivanov <anton.ivanov at cambridgegreys.com>
Cc: Johannes Berg <johannes at sipsolutions.net>
Cc: Ingo Molnar <mingo at redhat.com>
Cc: Borislav Petkov <bp at alien8.de>
Cc: Dave Hansen <dave.hansen at linux.intel.com>
Cc: H. Peter Anvin <hpa at zytor.com>
Cc: Chris Zankel <chris at zankel.net>
Cc: Max Filippov <jcmvbkbc at gmail.com>
Cc: John Stultz <john.stultz at linaro.org>
Cc: Stephen Boyd <sboyd at kernel.org>
Cc: Dinh Nguyen <dinguyen at kernel.org>
Cc: linux-arm-kernel at lists.infradead.org
Cc: linux-m68k at lists.linux-m68k.org
Cc: linux-mips at vger.kernel.org
Cc: linux-riscv at lists.infradead.org
Cc: sparclinux at vger.kernel.org
Cc: linux-um at lists.infradead.org
Cc: x86 at kernel.org
Cc: linux-xtensa at linux-xtensa.org
Jason A. Donenfeld (11):
timekeeping: add accessor for raw clock
timekeeping: use ktime_read_raw_clock() for random_get_entropy() if no
get_cycles()
m68k: use ktime_read_raw_clock() for random_get_entropy() instead of
zero
riscv: use ktime_read_raw_clock() for random_get_entropy() instead of
zero
mips: use ktime_read_raw_clock() for random_get_entropy() instead of
zero
arm: use ktime_read_raw_clock() for random_get_entropy() instead of
zero
nios2: use ktime_read_raw_clock() for random_get_entropy() instead of
zero
x86: use ktime_read_raw_clock() for random_get_entropy() instead of
zero
um: use ktime_read_raw_clock() for random_get_entropy() instead of
zero
sparc: use ktime_read_raw_clock() for random_get_entropy() instead of
zero
xtensa: use ktime_read_raw_clock() for random_get_entropy() instead of
zero
arch/arm/include/asm/timex.h | 1 +
arch/m68k/include/asm/timex.h | 2 +-
arch/mips/include/asm/timex.h | 2 +-
arch/nios2/include/asm/timex.h | 2 ++
arch/riscv/include/asm/timex.h | 2 +-
arch/sparc/include/asm/timex_32.h | 4 +---
arch/um/include/asm/timex.h | 9 ++-------
arch/x86/include/asm/tsc.h | 10 ++++++++++
arch/xtensa/include/asm/timex.h | 6 ++----
include/linux/timex.h | 8 ++++++++
kernel/time/timekeeping.c | 8 ++++++++
11 files changed, 37 insertions(+), 17 deletions(-)
--
2.35.1
More information about the linux-riscv
mailing list