Recent changes (master)
Subsystems (2)
The following changes since commit c6d140fb8c0cf58d61bbd42ea5382f42d3b8fa20:
Fix aux_path for verify state saving (2015-08-21 11:09:03 -0700)
are available in the git repository at:
git://git.kernel.dk/fio.git master
for you to fetch changes up to 61b9861d45dcd6be23c527861b32aa36bcd1b682:
use 'lib/pattern' to parse patterns and paste formats into buffers (2015-09-04 13:33:09 -0600)
----------------------------------------------------------------
Andrey Kuzmin (1):
backend: fix comparison of 'ret' pointer
Ken Raeburn (1):
Retry bdev cache invalidation for EAGAIN errors
Roman Pen (6):
lib/strntol: add 'strntol' function
lib/pattern: add set of functions to parse combined pattern input replace 'fill_pattern' with 'cpy_pattern' from 'lib/pattern.c'
verify: use 'cmp_pattern' from 'lib/pattern.c' to compare pattern and buffer add FIELD_SIZE macro to calculate the size of the specified field use 'lib/pattern' to parse patterns and paste formats into buffers
HOWTO | 20 ++- Makefile | 9 +- backend.c | 2 +- filesetup.c | 12 ++ fio.h | 3 +- lib/pattern.c | 464 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/pattern.h | 47 ++++++ lib/rand.c | 31 +--- lib/rand.h | 1 - lib/strntol.c | 31 ++++ lib/strntol.h | 6 + options.c | 166 ++++---------------- thread_options.h | 3 + verify.c | 62 +++++--- verify.h | 5 + 15 files changed, 669 insertions(+), 193 deletions(-) create mode 100644 lib/pattern.c create mode 100644 lib/pattern.h create mode 100644 lib/strntol.c create mode 100644 lib/strntol.h
---
Diff of recent changes:
HOWTO +18 -2
@@ -623,7 +623,16 @@ buffer_pattern=str If set, fio will fill the io buffers with this the other options related to buffer contents. The setting can be any pattern of bytes, and can be prefixed with 0x for hex values. It may also be a string, where the string must then - be wrapped with "". + be wrapped with "", e.g.: + + buffer_pattern="abcd" + or + buffer_pattern=-12 + or + buffer_pattern=0xdeadface + + Also you can combine everything together in any order: + buffer_pattern=0xdeadface"abcd"-12 dedupe_percentage=int If set, fio will generate this percentage of identical buffers when writing. These buffers will be
@@ -1324,7 +1333,14 @@ verify_pattern=str If set, fio will fill the io buffers with this buffer at the time(it can be either a decimal or a hex number). The verify_pattern if larger than a 32-bit quantity has to be a hex number that starts with either "0x" or "0X". Use - with verify=meta. + with verify=meta. Also, verify_pattern supports %o format, + which means that for each block offset will be written and + then verifyied back, e.g.: + + verify_pattern=%o + + Or use combination of everything: + verify_pattern=0xff%o"abcd"-12 verify_fatal=bool Normally fio will keep checking the entire contents before quitting on a block verification failure. If this
Makefile +5 -4
@@ -39,11 +39,11 @@ endif SOURCE := gettime.c ioengines.c init.c stat.c log.c time.c filesetup.c \ eta.c verify.c memory.c io_u.c parse.c mutex.c options.c \ lib/rbtree.c smalloc.c filehash.c profile.c debug.c lib/rand.c \ - lib/num2str.c lib/ieee754.c engines/cpu.c \ + lib/num2str.c lib/ieee754.c lib/strntol.c engines/cpu.c \ engines/mmap.c engines/sync.c engines/null.c engines/net.c \ memalign.c server.c client.c iolog.c backend.c libfio.c flow.c \ - cconv.c lib/prio_tree.c json.c lib/zipf.c lib/axmap.c \ - lib/lfsr.c gettime-thread.c helpers.c lib/flist_sort.c \ + cconv.c lib/prio_tree.c lib/zipf.c lib/axmap.c lib/pattern.c \ + lib/lfsr.c gettime-thread.c helpers.c lib/flist_sort.c json.c \ lib/hweight.c lib/getrusage.c idletime.c td_error.c \ profiles/tiobench.c profiles/act.c io_u_queue.c filelock.c \ lib/tp.c lib/bloom.c lib/gauss.c lib/mountcheck.c workqueue.c \
@@ -198,7 +198,8 @@ T_IEEE_OBJS += lib/ieee754.o T_IEEE_PROGS = t/ieee754 T_ZIPF_OBS = t/genzipf.o -T_ZIPF_OBJS += t/log.o lib/ieee754.o lib/rand.o lib/zipf.o lib/gauss.o t/genzipf.o +T_ZIPF_OBJS += t/log.o lib/ieee754.o lib/rand.o lib/pattern.o lib/zipf.o \ + lib/strntol.o lib/gauss.o t/genzipf.o T_ZIPF_PROGS = t/fio-genzipf T_AXMAP_OBJS = t/axmap.o
backend.c +1 -1
@@ -540,7 +540,7 @@ sync_done: *ret = ret2;break ;default : -assert (ret <0 ); +assert (*ret <0 );td_verror (td, -(*ret),"td_io_queue" );break ; }
filesetup.c +12 -0
@@ -413,7 +413,19 @@ static int __file_invalidate_cache(struct thread_data *td, struct fio_file *f,else if (f->filetype ==FIO_TYPE_FILE ) ret =posix_fadvise (f->fd, off, len,POSIX_FADV_DONTNEED );else if (f->filetype ==FIO_TYPE_BD ) { +int retry_count =0 ; + ret =blockdev_invalidate_cache (f); +while (ret <0 && errno ==EAGAIN && retry_count++ <25 ) { +/* +* Linux multipath devices reject ioctl while +* the maps are being updated. That window can +* last tens of milliseconds; we'll try up to +* a quarter of a second. +*/ +usleep (10000 ); + ret =blockdev_invalidate_cache (f); + }if (ret <0 && errno ==EACCES &&geteuid ()) {if (!root_warn) { log_err("fio: only root may flush block "
fio.h +2 -1
@@ -668,7 +668,8 @@ extern const char *fio_get_arch_string(int);extern const char *fio_get_os_string (int );#ifdef FIO_INTERNAL -#define ARRAY_SIZE (x) (sizeof((x)) / (sizeof((x)[0]))) +#define ARRAY_SIZE (x) (sizeof((x)) / (sizeof((x)[0]))) +#define FIELD_SIZE (s, f) (sizeof(((typeof(s))0)->f))#endif enum {
lib/pattern.c new file +464 -0
464 lines not on this page · raw message
lib/pattern.h new file +47 -0
47 lines not on this page · raw message
lib/rand.c +3 -28
@@ -36,6 +36,7 @@#include <string.h> #include <assert.h> #include "rand.h" +#include "lib/pattern.h" #include "../hash.h" int arch_random;
@@ -134,32 +135,6 @@ unsigned long fill_random_buf(struct frand_state *fs, void *buf,return r; } -void fill_pattern (void *p,unsigned int len,char *pattern, -unsigned int pattern_bytes) -{ -switch (pattern_bytes) { -case 0 : -assert (0 ); -break ; -case 1 : -memset (p, pattern[0 ], len); -break ; -default : { -unsigned int i =0 , size =0 ; -unsigned char *b = p; - -while (i < len) { - size = pattern_bytes; -if (size > (len - i)) - size = len - i; -memcpy (b+i, pattern, size); - i += size; - } -break ; - } - } -} - void __fill_random_buf_percentage(unsigned long seed, void *buf, unsigned int percentage, unsigned int segment, unsigned int len,
@@ -169,7 +144,7 @@ void __fill_random_buf_percentage(unsigned long seed, void *buf,if (percentage ==100 ) {if (pbytes) -fill_pattern (buf, len, pattern, pbytes); + (void )cpy_pattern (pattern, pbytes, buf, len);else memset (buf,0 , len);return ;
@@ -199,7 +174,7 @@ void __fill_random_buf_percentage(unsigned long seed, void *buf, this_len = len;if (pbytes) -fill_pattern (buf, this_len, pattern, pbytes); + (void )cpy_pattern (pattern, pbytes, buf, this_len);else memset (buf,0 , this_len);
lib/rand.h +0 -1
@@ -110,6 +110,5 @@ extern void __fill_random_buf(void *buf, unsigned int len, unsigned long seed);extern unsigned long fill_random_buf (struct frand_state *,void *buf,unsigned int len);extern void __fill_random_buf_percentage (unsigned long ,void *,unsigned int ,unsigned int ,unsigned int ,char *,unsigned int );extern unsigned long fill_random_buf_percentage (struct frand_state *,void *,unsigned int ,unsigned int ,unsigned int ,char *,unsigned int ); -extern void fill_pattern (void *p,unsigned int len,char *pattern,unsigned int pattern_bytes);#endif
lib/strntol.c new file +31 -0
@@ -0,0 +1,31 @@ +#include <string.h> +#include <stdlib.h> +#include <limits.h> + +long strntol (const char *str,size_t sz,char **end,int base) +{ +/* Expect that digit representation of LONG_MAX/MIN +* not greater than this buffer */ +char buf[24 ]; +long ret; +const char *beg = str; + +/* Catch up leading spaces */ +for (; beg && sz && *beg ==' ' ; beg++, sz--) + ; + +if (!sz || sz >=sizeof (buf)) { +if (end) + *end = (char *)str; +return 0 ; + } + +memcpy (buf, beg, sz); + buf[sz] ='\0' ; + ret =strtol (buf, end, base); +if (ret ==LONG_MIN || ret ==LONG_MAX ) +return ret; +if (end) + *end = (char *)str + (*end - buf); +return ret; +}
lib/strntol.h new file +6 -0
@@ -0,0 +1,6 @@ +#ifndef FIO_STRNTOL_H +#define FIO_STRNTOL_H + +long strntol (const char *str,size_t sz,char **end,int base); + +#endif
options.c +31 -135
209 lines not on this page · raw message
thread_options.h +3 -0
@@ -7,6 +7,7 @@#include "stat.h" #include "gettime.h" #include "lib/ieee754.h" +#include "lib/pattern.h" #include "td_error.h" /*
@@ -97,6 +98,8 @@ struct thread_options {unsigned int verify_offset;char verify_pattern[MAX_PATTERN_SIZE ];unsigned int verify_pattern_bytes; +struct pattern_fmt verify_fmt[8 ]; +unsigned int verify_fmt_sz;unsigned int verify_fatal;unsigned int verify_dump;unsigned int verify_async;
verify.c +41 -21
113 lines not on this page · raw message
verify.h +5 -0
@@ -89,6 +89,11 @@ extern void fio_verify_init(struct thread_data *td);extern int verify_async_init (struct thread_data *);extern void verify_async_exit (struct thread_data *); +/* +* Callbacks for pasting formats in the pattern buffer +*/ +extern int paste_blockoff (char *buf,unsigned int len,void *priv); +struct thread_rand32_state {uint32_t s[4 ]; };