On Thu, Nov 14, 2019 at 12:39:32PM +0100, richard.henderson@xxxxxxxxxx wrote: > +bool arch_get_random_seed_long(unsigned long *v) > +{ > + bool ok; > + > + if (static_branch_likely(&arm64_const_caps_ready)) { > + if (__cpus_have_const_cap(ARM64_HAS_RNG)) > + return arm64_rndr(v); > + return false; > + } > + > + /* > + * Before const_caps_ready, check the current cpu. > + * This will generally be the boot cpu for rand_initialize(). > + */ > + preempt_disable_notrace(); > + ok = this_cpu_has_cap(ARM64_HAS_RNG) && arm64_rndr(v); > + preempt_enable_notrace(); > + > + return ok; > +} As I asked previously, please separate the common case and the boot-cpu init-time case into separate functions. The runtime function should just check the RNG cap before using the instruction, without any preemption check or explicit check of arm64_const_caps_ready. i.e. static bool arm64_rndr(unsigned long *v) { bool ok; if (!cpus_have_const_cap(ARM64_HAS_RNG)) return false; /* * Reads of RNDR set PSTATE.NZCV to 0b0000 on success, * and set PSTATE.NZCV to 0b0100 otherwise. */ asm volatile( __mrs_s("%0", SYS_RNDR_EL0) "\n" " cset %w1, ne\n" : "=r" (*v), "=r" (ok) : : "cc"); return ok; } Any boot-time seeding should be in a separate function that external callers cannot invoke at runtime. Either have an arch function that the common random code calls at init time on the boot CPU, or have some arch_add_foo_entropy() function that the arm64 code can call somewhere around setup_arch(). Thanks, Mark.