diff options
author | Alexander Motin <[email protected]> | 2021-06-22 19:35:23 -0400 |
---|---|---|
committer | GitHub <[email protected]> | 2021-06-22 17:35:23 -0600 |
commit | 29274c9f6d7caa864d2c95cb797ca3cf32b4ef66 (patch) | |
tree | bfbbeb3232ea78004c7da180789a6c1a6e328ab0 /include/os/freebsd/spl | |
parent | ba91311561834774bc8fedfafb19ca1012c9dadd (diff) |
Optimize small random numbers generation
In all places except two spa_get_random() is used for small values,
and the consumers do not require well seeded high quality values.
Switch those two exceptions directly to random_get_pseudo_bytes()
and optimize spa_get_random(), renaming it to random_in_range(),
since it is not related to SPA or ZFS in general.
On FreeBSD directly map random_in_range() to new prng32_bounded() KPI
added in FreeBSD 13. On Linux and in user-space just reduce the type
used to uint32_t to avoid more expensive 64bit division.
Reviewed-by: Ryan Moeller <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Alexander Motin <[email protected]>
Sponsored-By: iXsystems, Inc.
Closes #12183
Diffstat (limited to 'include/os/freebsd/spl')
-rw-r--r-- | include/os/freebsd/spl/sys/random.h | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/include/os/freebsd/spl/sys/random.h b/include/os/freebsd/spl/sys/random.h index b3c9115f5..746275e53 100644 --- a/include/os/freebsd/spl/sys/random.h +++ b/include/os/freebsd/spl/sys/random.h @@ -30,6 +30,9 @@ #define _OPENSOLARIS_SYS_RANDOM_H_ #include_next <sys/random.h> +#if __FreeBSD_version >= 1300108 +#include <sys/prng.h> +#endif static inline int random_get_bytes(uint8_t *p, size_t s) @@ -45,4 +48,23 @@ random_get_pseudo_bytes(uint8_t *p, size_t s) return (0); } +static inline uint32_t +random_in_range(uint32_t range) +{ +#if __FreeBSD_version >= 1300108 + return (prng32_bounded(range)); +#else + uint32_t r; + + ASSERT(range != 0); + + if (range == 1) + return (0); + + (void) random_get_pseudo_bytes((void *)&r, sizeof (r)); + + return (r % range); +#endif +} + #endif /* !_OPENSOLARIS_SYS_RANDOM_H_ */ |