Skip to content

Commit

Permalink
Merge branch 'multi_seed_refill' of https://github.com/sungup/fio
Browse files Browse the repository at this point in the history
* 'multi_seed_refill' of https://github.com/sungup/fio:
  lib/rand: Enhance __fill_random_buf using the multi random seed
  • Loading branch information
axboe committed Aug 10, 2022
2 parents 6cafe84 + 7ff204c commit 6b2353c
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 1 deletion.
17 changes: 17 additions & 0 deletions configure
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -174,6 +178,7 @@ libnfs=""
xnvme=""
libzbc=""
dfs=""
seed_buckets=""
dynamic_engines="no"
prefix=/usr/local

Expand Down Expand Up @@ -255,6 +260,8 @@ for opt do
;;
--enable-asan) asan="yes"
;;
--seed-buckets=*) seed_buckets="$optarg"
;;
--help)
show_help="yes"
;;
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down
37 changes: 36 additions & 1 deletion lib/rand.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -110,6 +110,41 @@ 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)
{
#define MAX_SEED_BUCKETS 16
static uint64_t prime[MAX_SEED_BUCKETS] = {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)
{
Expand Down

0 comments on commit 6b2353c

Please sign in to comment.