X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=verify.c;h=7957bd4110d88bea8aecc242c6460f739871ef99;hb=2084d7b2369254e2026315caea702089198b754b;hp=6b54b70ff672ffd3c75f7e0b3b72d35592c1e91c;hpb=f3e6cb95fecf867ec46e3dfd59ef1a1db1b6ad2a;p=fio.git diff --git a/verify.c b/verify.c index 6b54b70f..7957bd41 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,44 +22,31 @@ #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) +void fill_pattern(struct thread_data *td, void *p, unsigned int len, struct io_u *io_u) { 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: + if (io_u->buf_filled_len >= len) { + dprint(FD_VERIFY, "using already filled verify pattern b=0 len=%u\n", len); + return; + } dprint(FD_VERIFY, "fill verify pattern b=0 len=%u\n", len); memset(p, td->o.verify_pattern[0], len); + io_u->buf_filled_len = len; break; default: { unsigned int i = 0, size = 0; unsigned char *b = p; + if (io_u->buf_filled_len >= len) { + dprint(FD_VERIFY, "using already filled verify pattern b=%d len=%u\n", + td->o.verify_pattern_bytes, len); + return; + } dprint(FD_VERIFY, "fill verify pattern b=%d len=%u\n", td->o.verify_pattern_bytes, len); @@ -69,6 +57,7 @@ static void fill_pattern(struct thread_data *td, void *p, unsigned int len) memcpy(b+i, td->o.verify_pattern, size); i += size; } + io_u->buf_filled_len = len; break; } } @@ -697,7 +686,7 @@ void populate_verify_io_u(struct thread_data *td, struct io_u *io_u) if (td->o.verify == VERIFY_NULL) return; - fill_pattern(td, p, io_u->buflen); + fill_pattern(td, p, io_u->buflen, io_u); hdr_inc = io_u->buflen; if (td->o.verify_interval) @@ -897,12 +886,16 @@ done: int verify_async_init(struct thread_data *td) { int i, ret; + pthread_attr_t attr; + + pthread_attr_init(&attr); + pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN); td->verify_thread_exit = 0; td->verify_threads = malloc(sizeof(pthread_t) * td->o.verify_async); for (i = 0; i < td->o.verify_async; i++) { - ret = pthread_create(&td->verify_threads[i], NULL, + ret = pthread_create(&td->verify_threads[i], &attr, verify_async_thread, td); if (ret) { log_err("fio: async verify creation failed: %s\n", @@ -918,6 +911,8 @@ int verify_async_init(struct thread_data *td) td->nr_verify_threads++; } + pthread_attr_destroy(&attr); + if (i != td->o.verify_async) { log_err("fio: only %d verify threads started, exiting\n", i); td->verify_thread_exit = 1;