From 637ef8d9f7645135cf4829894d1e3983cd7a042e Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Mon, 21 Jun 2010 20:39:38 +0200 Subject: [PATCH] Speedup verify random fills by 10-15x Move the pseudo-random helper into lib/rand.c and use that from the verify populate as well. Signed-off-by: Jens Axboe --- io_u.c | 20 ++++---------------- lib/rand.c | 17 +++++++++++++++++ lib/rand.h | 1 + verify.c | 26 ++------------------------ 4 files changed, 24 insertions(+), 40 deletions(-) diff --git a/io_u.c b/io_u.c index f451d1a7..69edd70e 100644 --- a/io_u.c +++ b/io_u.c @@ -1240,20 +1240,8 @@ void io_u_queued(struct thread_data *td, struct io_u *io_u) void io_u_fill_buffer(struct thread_data *td, struct io_u *io_u, unsigned int max_bs) { - long *ptr = io_u->buf; - - if (!td->o.zero_buffers) { - unsigned long r = __rand(&__fio_rand_state); - - if (sizeof(int) != sizeof(*ptr)) - r *= (unsigned long) __rand(&__fio_rand_state); - - while ((void *) ptr - io_u->buf < max_bs) { - *ptr = r; - ptr++; - r *= GOLDEN_RATIO_PRIME; - r >>= 3; - } - } else - memset(ptr, 0, max_bs); + if (!td->o.zero_buffers) + fill_random_buf(io_u->buf, max_bs); + else + memset(io_u->buf, 0, max_bs); } diff --git a/lib/rand.c b/lib/rand.c index cecc4c21..839a6a94 100644 --- a/lib/rand.c +++ b/lib/rand.c @@ -34,6 +34,7 @@ */ #include "rand.h" +#include "../hash.h" struct frand_state __fio_rand_state; @@ -57,3 +58,19 @@ void init_rand(struct frand_state *state) __rand(state); __rand(state); } + +void fill_random_buf(void *buf, unsigned int len) +{ + unsigned long r = __rand(&__fio_rand_state); + long *ptr = buf; + + if (sizeof(int) != sizeof(*ptr)) + r *= (unsigned long) __rand(&__fio_rand_state); + + while ((void *) ptr - buf < len) { + *ptr = r; + ptr++; + r *= GOLDEN_RATIO_PRIME; + r >>= 3; + } +} diff --git a/lib/rand.h b/lib/rand.h index 363e7b6d..573116cb 100644 --- a/lib/rand.h +++ b/lib/rand.h @@ -19,5 +19,6 @@ static inline unsigned int __rand(struct frand_state *state) } extern void init_rand(struct frand_state *); +extern void fill_random_buf(void *buf, unsigned int len); #endif diff --git a/verify.c b/verify.c index 6b54b70f..265bd556 100644 --- a/verify.c +++ b/verify.c @@ -10,6 +10,7 @@ #include "fio.h" #include "verify.h" #include "smalloc.h" +#include "lib/rand.h" #include "crc/md5.h" #include "crc/crc64.h" @@ -21,35 +22,12 @@ #include "crc/sha512.h" #include "crc/sha1.h" -static void fill_random_bytes(struct thread_data *td, void *p, unsigned int len) -{ - unsigned int todo; - int r; - - while (len) { - r = os_random_long(&td->verify_state); - - /* - * lrand48_r seems to be broken and only fill the bottom - * 32-bits, even on 64-bit archs with 64-bit longs - */ - todo = sizeof(r); - if (todo > len) - todo = len; - - memcpy(p, &r, todo); - - len -= todo; - p += todo; - } -} - static void fill_pattern(struct thread_data *td, void *p, unsigned int len) { switch (td->o.verify_pattern_bytes) { case 0: dprint(FD_VERIFY, "fill random bytes len=%u\n", len); - fill_random_bytes(td, p, len); + fill_random_buf(p, len); break; case 1: dprint(FD_VERIFY, "fill verify pattern b=0 len=%u\n", len); -- 2.25.1