path: root/sys/sys/prng.h
diff options
authorConrad Meyer <cem@FreeBSD.org>2020-08-13 20:48:14 +0000
committerConrad Meyer <cem@FreeBSD.org>2020-08-13 20:48:14 +0000
commit8a0edc914ffdda876987add5128da3ee236a6a12 (patch)
tree1555e019838dfb5459fdcfad310285ab48d7f879 /sys/sys/prng.h
parent1e04d9ff3e2565a402e449eb59b30b826bb2894a (diff)
Add prng(9) API
Add prng(9) as a replacement for random(9) in the kernel. There are two major differences from random(9) and random(3): - General prng(9) APIs (prng32(9), etc) do not guarantee an implementation or particular sequence; they should not be used for repeatable simulations. - However, specific named API families are also exposed (for now: PCG), and those are expected to be repeatable (when so-guaranteed by the named algorithm). Some minor differences from random(3) and earlier random(9): - PRNG state for the general prng(9) APIs is per-CPU; this eliminates contention on PRNG state in SMP workloads. Each PCPU generator in an SMP system produces a unique sequence. - Better statistical properties than the Park-Miller ("minstd") PRNG (longer period, uniform distribution in all bits, passes BigCrush/PractRand analysis). - Faster than Park-Miller ("minstd") PRNG -- no division is required to step PCG-family PRNGs. For now, random(9) becomes a thin shim around prng32(). Eventually I would like to mechanically switch consumers over to the explicit API. Reviewed by: kib, markj (previous version both) Discussed with: markm Differential Revision: https://reviews.freebsd.org/D25916
Notes: svn path=/head/; revision=364219
Diffstat (limited to 'sys/sys/prng.h')
1 files changed, 20 insertions, 0 deletions
diff --git a/sys/sys/prng.h b/sys/sys/prng.h
new file mode 100644
index 000000000000..a1abe6ad1a11
--- /dev/null
+++ b/sys/sys/prng.h
@@ -0,0 +1,20 @@
+ * This file is in the public domain.
+ *
+ * $FreeBSD$
+ */
+#ifndef _SYS_PRNG_H_
+#define _SYS_PRNG_H_
+#include <contrib/pcg-c/include/pcg_variants.h>
+#ifdef _KERNEL
+__uint32_t prng32(void);
+__uint32_t prng32_bounded(__uint32_t bound);
+__uint64_t prng64(void);
+__uint64_t prng64_bounded(__uint64_t bound);