Recent changes (master)

Jens Axboe
2014-04-09T12:00:08Z

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:

diff --git a/arch/arch-s390.h b/arch/arch-s390.h
index bcd9163..56cb230 100644
--- a/arch/arch-s390.h
+++ b/arch/arch-s390.h
@@ -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
diff --git a/blktrace.c b/blktrace.c
index 4b5567e..52f0c71 100644
--- a/blktrace.c
+++ b/blktrace.c
@@ -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);
diff --git a/diskutil.c b/diskutil.c
index 9aa1fa1..cbde42e 100644
--- a/diskutil.c
+++ b/diskutil.c
@@ -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;
diff --git a/engines/net.c b/engines/net.c
index 110e158..fcf4b89 100644
--- a/engines/net.c
+++ b/engines/net.c
@@ -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) {
diff --git a/engines/rbd.c b/engines/rbd.c
index 9d64efd..ff35373 100644
--- a/engines/rbd.c
+++ b/engines/rbd.c
@@ -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;
diff --git a/filesetup.c b/filesetup.c
index bf05b6f..abea1e6 100644
--- a/filesetup.c
+++ b/filesetup.c
@@ -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++;

diff --git a/gettime.c b/gettime.c
index b89cd46..c6d45f8 100644
--- a/gettime.c
+++ b/gettime.c
@@ -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)
diff --git a/iolog.c b/iolog.c
index e805eae..1eb89b2 100644
--- a/iolog.c
+++ b/iolog.c
@@ -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;
diff --git a/server.c b/server.c
index d72835b..beee2db 100644
--- a/server.c
+++ b/server.c
@@ -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;
}