Chasing down to what random_get_entropy() resolves is a 'spot the mouse' game through a maze of #ifdeffery. Also the placement in timex.h is non-obvious and has just been chosen because it provides conveniant access to the underlying get_cycles() #ifdeffery.
Provide a config switch which is selectable by the architecture and a temporary #ifdef guard in timex.h. Architectures which select the config switch must provide asm/random.h with the architecture specific implementation. Update all usage sites to include linux/random.h so that the gradual conversion does not cause build regressions. This is part of a larger effort to remove get_cycles() usage from non-architecture code. Signed-off-by: Thomas Gleixner <[email protected]> Cc: "Jason A. Donenfeld" <[email protected]> --- arch/Kconfig | 3 +++ arch/loongarch/kernel/relocate.c | 1 + arch/mips/kernel/relocate.c | 1 + crypto/jitterentropy-kcapi.c | 1 + include/linux/random.h | 15 +++++++++++++++ include/linux/timex.h | 2 ++ kernel/kcsan/core.c | 1 + 7 files changed, 24 insertions(+) --- a/arch/Kconfig +++ b/arch/Kconfig @@ -370,6 +370,9 @@ config ARCH_HAS_CPU_FINALIZE_INIT config ARCH_HAS_DELAY_TIMER bool +config ARCH_HAS_RANDOM_ENTROPY + bool + # The architecture has a per-task state that includes the mm's PASID config ARCH_HAS_CPU_PASID bool --- a/arch/loongarch/kernel/relocate.c +++ b/arch/loongarch/kernel/relocate.c @@ -9,6 +9,7 @@ #include <linux/kernel.h> #include <linux/printk.h> #include <linux/panic_notifier.h> +#include <linux/random.h> #include <linux/start_kernel.h> #include <asm/bootinfo.h> #include <asm/early_ioremap.h> --- a/arch/mips/kernel/relocate.c +++ b/arch/mips/kernel/relocate.c @@ -19,6 +19,7 @@ #include <linux/libfdt.h> #include <linux/of_fdt.h> #include <linux/panic_notifier.h> +#include <linux/random.h> #include <linux/sched/task.h> #include <linux/start_kernel.h> #include <linux/string.h> --- a/crypto/jitterentropy-kcapi.c +++ b/crypto/jitterentropy-kcapi.c @@ -42,6 +42,7 @@ #include <linux/fips.h> #include <linux/kernel.h> #include <linux/module.h> +#include <linux/random.h> #include <linux/slab.h> #include <linux/time.h> #include <crypto/internal/rng.h> --- a/include/linux/random.h +++ b/include/linux/random.h @@ -139,4 +139,19 @@ int random_online_cpu(unsigned int cpu); extern const struct file_operations random_fops, urandom_fops; #endif +unsigned long random_get_entropy_fallback(void); + +/* + * random_get_entropy() is used by the /dev/random driver in order to extract + * entropy via the relative unpredictability of when an interrupt takes places + * versus a high speed, fine-grained timing source or cycle counter. Since it + * will be occurred on every single interrupt, it must have a very low + * cost/overhead. + * + * If an architecture does not provide it, then use random_get_entropy_fallback(). + */ +#ifdef CONFIG_ARCH_HAS_RANDOM_ENTROPY +#include <asm/random.h> +#endif + #endif /* _LINUX_RANDOM_H */ --- a/include/linux/timex.h +++ b/include/linux/timex.h @@ -66,6 +66,7 @@ unsigned long random_get_entropy_fallbac #include <asm/timex.h> +#ifndef CONFIG_ARCH_HAS_RANDOM_ENTROPY #ifndef random_get_entropy /* * The random_get_entropy() function is used by the /dev/random driver @@ -85,6 +86,7 @@ unsigned long random_get_entropy_fallbac #define random_get_entropy() random_get_entropy_fallback() #endif #endif +#endif /* * SHIFT_PLL is used as a dampening factor to define how much we --- a/kernel/kcsan/core.c +++ b/kernel/kcsan/core.c @@ -18,6 +18,7 @@ #include <linux/moduleparam.h> #include <linux/percpu.h> #include <linux/preempt.h> +#include <linux/random.h> #include <linux/sched.h> #include <linux/string.h> #include <linux/uaccess.h>

