The following changes since commit 6cafe8445fd1e04e5f7d67bbc73029a538d1b253: Fio 3.31 (2022-08-09 14:41:25 -0600) are available in the Git repository at: git://git.kernel.dk/fio.git master for you to fetch changes up to 9dc528b1638b625b5e167983a74de4e85c5859ea: lib/rand: get rid of unused MAX_SEED_BUCKETS (2022-08-10 09:51:49 -0600) ---------------------------------------------------------------- Jens Axboe (2): Merge branch 'multi_seed_refill' of https://github.com/sungup/fio lib/rand: get rid of unused MAX_SEED_BUCKETS Sungup Moon (1): lib/rand: Enhance __fill_random_buf using the multi random seed configure | 17 +++++++++++++++++ lib/rand.c | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 1 deletion(-) --- Diff of recent changes: diff --git a/configure b/configure index 36450df8..a2b9bd4c 100755 --- a/configure +++ b/configure @@ -116,6 +116,10 @@ has() { type "$1" >/dev/null 2>&1 } +num() { + echo "$1" | grep -P -q "^[0-9]+$" +} + check_define() { cat > $TMPC <<EOF #if !defined($1) @@ -174,6 +178,7 @@ libnfs="" xnvme="" libzbc="" dfs="" +seed_buckets="" dynamic_engines="no" prefix=/usr/local @@ -255,6 +260,8 @@ for opt do ;; --enable-asan) asan="yes" ;; + --seed-buckets=*) seed_buckets="$optarg" + ;; --help) show_help="yes" ;; @@ -302,6 +309,7 @@ if test "$show_help" = "yes" ; then echo "--dynamic-libengines Lib-based ioengines as dynamic libraries" echo "--disable-dfs Disable DAOS File System support even if found" echo "--enable-asan Enable address sanitizer" + echo "--seed-buckets= Number of seed buckets for the refill-buffer" exit $exit_val fi @@ -3273,6 +3281,15 @@ if test "$disable_tcmalloc" != "yes"; then fi fi print_config "TCMalloc support" "$tcmalloc" +if ! num "$seed_buckets"; then + seed_buckets=4 +elif test "$seed_buckets" -lt 2; then + seed_buckets=2 +elif test "$seed_buckets" -gt 16; then + seed_buckets=16 +fi +echo "#define CONFIG_SEED_BUCKETS $seed_buckets" >> $config_host_h +print_config "seed_buckets" "$seed_buckets" echo "LIBS+=$LIBS" >> $config_host_mak echo "GFIO_LIBS+=$GFIO_LIBS" >> $config_host_mak diff --git a/lib/rand.c b/lib/rand.c index 1e669116..0e787a62 100644 --- a/lib/rand.c +++ b/lib/rand.c @@ -95,7 +95,7 @@ void init_rand_seed(struct frand_state *state, uint64_t seed, bool use64) __init_rand64(&state->state64, seed); } -void __fill_random_buf(void *buf, unsigned int len, uint64_t seed) +void __fill_random_buf_small(void *buf, unsigned int len, uint64_t seed) { uint64_t *b = buf; uint64_t *e = b + len / sizeof(*b); @@ -110,6 +110,37 @@ void __fill_random_buf(void *buf, unsigned int len, uint64_t seed) __builtin_memcpy(e, &seed, rest); } +void __fill_random_buf(void *buf, unsigned int len, uint64_t seed) +{ + static uint64_t prime[] = {1, 2, 3, 5, 7, 11, 13, 17, + 19, 23, 29, 31, 37, 41, 43, 47}; + uint64_t *b, *e, s[CONFIG_SEED_BUCKETS]; + unsigned int rest; + int p; + + /* + * Calculate the max index which is multiples of the seed buckets. + */ + rest = (len / sizeof(*b) / CONFIG_SEED_BUCKETS) * CONFIG_SEED_BUCKETS; + + b = buf; + e = b + rest; + + rest = len - (rest * sizeof(*b)); + + for (p = 0; p < CONFIG_SEED_BUCKETS; p++) + s[p] = seed * prime[p]; + + for (; b != e; b += CONFIG_SEED_BUCKETS) { + for (p = 0; p < CONFIG_SEED_BUCKETS; ++p) { + b[p] = s[p]; + s[p] = __hash_u64(s[p]); + } + } + + __fill_random_buf_small(b, rest, s[0]); +} + uint64_t fill_random_buf(struct frand_state *fs, void *buf, unsigned int len) {