Recent changes (master)
The following changes since commit bc4f5ef67d26ef98f4822d5f798cb8c4e2d2fce5:
Support limited mixed command line options and job file (2014-04-06 10:10:32 -0600)
are available in the git repository at:
git://git.kernel.dk/fio.git master
for you to fetch changes up to 42793d9467cc45d08ced5211c3797bf68a3d24cc:
iolog: skip max_bs[rw] increment for rw == DDIR_INVAL (2014-04-08 21:18:37 -0600)
----------------------------------------------------------------
Christian Ehrhardt (2):
fio: fix s390 time accounting
fio: fix s390 nop
Jens Axboe (7):
blktrace: probe IO depth
Merge branch 'master' of ssh://git.kernel.dk/data/git/fio Revert "Fixup ->open_files if not given" Increment open file count manually
server: fix fd leak in error case
diskutil: fix potential out-of-bounds array write
iolog: skip max_bs[rw] increment for rw == DDIR_INVAL
arch/arch-s390.h | 15 ++++++++++----- blktrace.c | 23 +++++++++++++++++++++++ diskutil.c | 2 +- engines/net.c | 1 + engines/rbd.c | 1 + filesetup.c | 7 ------- gettime.c | 14 +++++++++++--- iolog.c | 2 +- server.c | 1 + 9 files changed, 49 insertions(+), 17 deletions(-)
---
Diff of recent changes:
arch/arch-s390.h +10 -5
@@ -18,18 +18,25 @@#define __NR_sys_vmsplice 309#endif -#define nop asm volatile ("diag 0,0,68" : : : "memory") +#define nop asm volatile("nop" : : : "memory")#define read_barrier () asm volatile("bcr 15,0" : : : "memory")#define write_barrier () asm volatile("bcr 15,0" : : : "memory") +/* +* Fio needs monotonic (never lower), but not strict monotonic (never the same) +* so store clock fast is enough +*/ static inline unsigned long long get_cpu_clock (void ) {unsigned long long clk; - __asm__ __volatile__("stck %0" :"=Q" (clk) : :"cc" ); -return clk; + __asm__ __volatile__("stckf %0" :"=Q" (clk) : :"cc" ); +return clk>>12 ; } +#define ARCH_CPU_CLOCK_CYCLES_PER_USEC 1 +#define ARCH_HAVE_CPU_CLOCK +#define ARCH_HAVE_INIT extern int tsc_reliable;static inline int arch_init (char *envp[])
@@ -38,6 +45,4 @@ static inline int arch_init(char *envp[]) return 0; } -#define ARCH_HAVE_CPU_CLOCK -#endif
blktrace.c +23 -0
@@ -217,6 +217,7 @@ static int trace_add_file(struct thread_data *td, __u32 device)dprint (FD_BLKTRACE ,"add devices %s\n" , dev); fileno =add_file_exclusive (td, dev); + td->o.open_files++; td->files[fileno]->major = maj; td->files[fileno]->minor = min;trace_add_open_close_event (td, fileno,FIO_LOG_OPEN_FILE );
@@ -373,6 +374,7 @@ int load_blktrace(struct thread_data *td, const char *filename, int need_swap)struct fifo *fifo;int fd, i, old_state;struct fio_file *f; +int this_depth, depth; fd =open (filename,O_RDONLY );if (fd <0 ) {
@@ -391,6 +393,7 @@ int load_blktrace(struct thread_data *td, const char *filename, int need_swap) ios[0 ] = ios[1 ] =0 ; rw_bs[0 ] = rw_bs[1 ] =0 ; skipped_writes =0 ; + this_depth = depth =0 ; do { int ret = trace_fifo_get(td, fifo, fd, &t, sizeof(t));
@@ -425,6 +428,12 @@ int load_blktrace(struct thread_data *td, const char *filename, int need_swap) goto err; }if ((t.action &BLK_TC_ACT (BLK_TC_NOTIFY )) ==0 ) { +if ((t.action &0xffff ) == __BLK_TA_QUEUE) + this_depth++; +else if ((t.action &0xffff ) == __BLK_TA_COMPLETE) { + depth =max (depth, this_depth); + this_depth =0 ; + }if (!ttime) { ttime = t.time; cpu = t.cpu;
@@ -469,6 +478,13 @@ int load_blktrace(struct thread_data *td, const char *filename, int need_swap)return 1 ; } +/* +* For stacked devices, we don't always get a COMPLETE event so +* the depth grows to insane values. Limit it to something sane(r). +*/ +if (!depth || depth >1024 ) + depth =1024 ; +if (skipped_writes)log_err ("fio: %s skips replay of %lu writes due to read-only\n" , td->o.name, skipped_writes);
@@ -494,6 +510,13 @@ int load_blktrace(struct thread_data *td, const char *filename, int need_swap)*/ td->o.odirect =1 ; +/* +* we don't know if this option was set or not. it defaults to 1, +* so we'll just guess that we should override it if it's still 1 +*/ +if (td->o.iodepth !=1 ) + td->o.iodepth = depth; +return 0 ; err:close (fd);
diskutil.c +1 -1
@@ -236,7 +236,7 @@ static void find_add_disk_slaves(struct thread_data *td, char *path,* are links to the real directories for the slave * devices? */ - linklen =readlink (temppath, slavepath,PATH_MAX -0 ); + linklen =readlink (temppath, slavepath,PATH_MAX -1 );if (linklen <0 ) {perror ("readlink() for slave device." );return ;
engines/net.c +1 -0
@@ -1196,6 +1196,7 @@ static int fio_netio_setup(struct thread_data *td)if (!td->files_index) {add_file (td, td->o.filename ?:"net" ,0 ,0 ); td->o.nr_files = td->o.nr_files ?:1 ; + td->o.open_files++; }if (!td->io_ops->data) {
engines/rbd.c +1 -0
@@ -379,6 +379,7 @@ static int fio_rbd_setup(struct thread_data *td)if (!td->files_index) {add_file (td, td->o.filename ? :"rbd" ,0 ,0 ); td->o.nr_files = td->o.nr_files ? :1 ; + td->o.open_files++; } f = td->files[0 ]; f->real_file_size = info.size;
filesetup.c +0 -7
@@ -1279,13 +1279,6 @@ int add_file(struct thread_data *td, const char *fname, int numjob, int inc)set_already_allocated (file_name); -/* -* For adding files after the fact - if openfiles= isn't -* given as an option, ensure we allow at least one file open -*/ -if (!td->o.open_files) - td->o.open_files =1 ; -if (inc) td->o.nr_files++;
gettime.c +11 -3
@@ -13,7 +13,7 @@#include "hash.h" #include "os/os.h" -#ifdef ARCH_HAVE_CPU_CLOCK +#if defined(ARCH_HAVE_CPU_CLOCK ) && !defined(ARCH_CPU_CLOCK_CYCLES_PER_USEC )static unsigned long cycles_per_usec;static unsigned long inv_cycles_per_usec;#endif
@@ -177,7 +177,11 @@ static void *__fio_gettime(struct timeval *tp) }else if (tv) tv->last_cycles = t; +#ifdef ARCH_CPU_CLOCK_CYCLES_PER_USEC + usecs = t /ARCH_CPU_CLOCK_CYCLES_PER_USEC ; +#else usecs = (t * inv_cycles_per_usec) /16777216UL ; +#endif tp->tv_sec = usecs /1000000 ; tp->tv_usec = usecs %1000000 ;break ;
@@ -229,7 +233,7 @@ void fio_gettime(struct timeval *tp, void fio_unused *caller) } } -#ifdef ARCH_HAVE_CPU_CLOCK +#if defined(ARCH_HAVE_CPU_CLOCK ) && !defined(ARCH_CPU_CLOCK_CYCLES_PER_USEC )static unsigned long get_cycles_per_usec (void ) {struct timeval s, e;
@@ -318,9 +322,13 @@ static int calibrate_cpu_clock(void)#else static int calibrate_cpu_clock (void ) { +#ifdef ARCH_CPU_CLOCK_CYCLES_PER_USEC +return 0 ; +#else return 1 ; -}#endif +} +#endif // ARCH_HAVE_CPU_CLOCK #ifndef CONFIG_TLS_THREAD void fio_local_clock_init (int is_thread)
iolog.c +1 -1
@@ -371,7 +371,7 @@ static int read_iolog2(struct thread_data *td, FILE *f) }else { ipo->offset = offset; ipo->len = bytes; -if (bytes > td->o.max_bs[rw]) +if (rw !=DDIR_INVAL && bytes > td->o.max_bs[rw]) td->o.max_bs[rw] = bytes; ipo->fileno = fileno; ipo->file_action = file_action;
server.c +1 -0
@@ -1394,6 +1394,7 @@ static int fio_init_server_connection(void)if (listen (sk,0 ) <0 ) {log_err ("fio: listen: %s\n" ,strerror (errno)); +close (sk);return -1 ; }