X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=lib%2Frand.c;h=0e787a62bad152568eee08824abf723716fec040;hp=1df1a7a049b9b14bb3c9334d4c2b7314e6168b07;hb=9dc528b1638b625b5e167983a74de4e85c5859ea;hpb=aa75fc9db6b98ad317911b35b4a968139a648bb8 diff --git a/lib/rand.c b/lib/rand.c index 1df1a7a0..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); @@ -103,13 +103,44 @@ void __fill_random_buf(void *buf, unsigned int len, uint64_t seed) for (; b != e; ++b) { *b = seed; - seed *= GOLDEN_RATIO_64; + seed = __hash_u64(seed); } if (fio_unlikely(rest)) __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) {