All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 01/13] Fix return value of make_filename() when no filename_format
@ 2017-03-28 20:02 kusumi.tomohiro
  2017-03-28 20:02 ` [PATCH 02/13] Use GOLDEN_RATIO_PRIME kusumi.tomohiro
                   ` (12 more replies)
  0 siblings, 13 replies; 17+ messages in thread
From: kusumi.tomohiro @ 2017-03-28 20:02 UTC (permalink / raw)
  To: axboe, fio; +Cc: Tomohiro Kusumi

From: Tomohiro Kusumi <tkusumi@tuxera.com>

This is unlikely to happen in the first place since ->filename_format
has a default value, and option parser can also detect an empty string,
but it should return buf which is sprintf'd right before returning.

A caller expects this function to return filename string (which is
buf arg itself in this case), and it also doesn't handle NULL return.

Signed-off-by: Tomohiro Kusumi <tkusumi@tuxera.com>
---
 init.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/init.c b/init.c
index 4a72255..6af6c45 100644
--- a/init.c
+++ b/init.c
@@ -1121,7 +1121,7 @@ static char *make_filename(char *buf, size_t buf_size,struct thread_options *o,
 
 	if (!o->filename_format || !strlen(o->filename_format)) {
 		sprintf(buf, "%s.%d.%d", jobname, jobnum, filenum);
-		return NULL;
+		return buf;
 	}
 
 	for (f = &fpre_keywords[0]; f->keyword; f++)
-- 
2.9.3



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 02/13] Use GOLDEN_RATIO_PRIME
  2017-03-28 20:02 [PATCH 01/13] Fix return value of make_filename() when no filename_format kusumi.tomohiro
@ 2017-03-28 20:02 ` kusumi.tomohiro
  2017-03-28 20:44   ` Jens Axboe
  2017-03-28 20:02 ` [PATCH 03/13] Test malloc result when allocation size is tunable kusumi.tomohiro
                   ` (11 subsequent siblings)
  12 siblings, 1 reply; 17+ messages in thread
From: kusumi.tomohiro @ 2017-03-28 20:02 UTC (permalink / raw)
  To: axboe, fio; +Cc: Tomohiro Kusumi

From: Tomohiro Kusumi <tkusumi@tuxera.com>

Using this macro (originally for hash in Linux kernel) for rand seed
instead of hard-coded value should make sense. rdma ioengine uses
this for the seed as well.

Signed-off-by: Tomohiro Kusumi <tkusumi@tuxera.com>
---
 init.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/init.c b/init.c
index 6af6c45..eef5150 100644
--- a/init.c
+++ b/init.c
@@ -26,6 +26,7 @@
 #include "idletime.h"
 #include "filelock.h"
 #include "steadystate.h"
+#include "hash.h"
 
 #include "oslib/getopt.h"
 #include "oslib/strcasestr.h"
@@ -1083,11 +1084,11 @@ static int setup_random_seeds(struct thread_data *td)
 
 	seed = td->o.rand_seed;
 	for (i = 0; i < 4; i++)
-		seed *= 0x9e370001UL;
+		seed *= GOLDEN_RATIO_PRIME;
 
 	for (i = 0; i < FIO_RAND_NR_OFFS; i++) {
 		td->rand_seeds[i] = seed * td->thread_number + i;
-		seed *= 0x9e370001UL;
+		seed *= GOLDEN_RATIO_PRIME;
 	}
 
 	td_fill_rand_seeds(td);
-- 
2.9.3



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 03/13] Test malloc result when allocation size is tunable
  2017-03-28 20:02 [PATCH 01/13] Fix return value of make_filename() when no filename_format kusumi.tomohiro
  2017-03-28 20:02 ` [PATCH 02/13] Use GOLDEN_RATIO_PRIME kusumi.tomohiro
@ 2017-03-28 20:02 ` kusumi.tomohiro
  2017-03-28 20:02 ` [PATCH 04/13] Don't malloc more than necessary on extending/prereading file kusumi.tomohiro
                   ` (10 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: kusumi.tomohiro @ 2017-03-28 20:02 UTC (permalink / raw)
  To: axboe, fio; +Cc: Tomohiro Kusumi

From: Tomohiro Kusumi <tkusumi@tuxera.com>

The allocation size td->o.max_bs[DDIR_XXX] can be specified by user,
so test the result although it can be over committed on some platforms.
In theory allocation size could be as large as maximum of uint.

Signed-off-by: Tomohiro Kusumi <tkusumi@tuxera.com>
---
 filesetup.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/filesetup.c b/filesetup.c
index bcf95bd..ce19cf0 100644
--- a/filesetup.c
+++ b/filesetup.c
@@ -160,6 +160,10 @@ static int extend_file(struct thread_data *td, struct fio_file *f)
 	}
 
 	b = malloc(td->o.max_bs[DDIR_WRITE]);
+	if (!b) {
+		td_verror(td, errno, "malloc");
+		goto err;
+	}
 
 	left = f->real_file_size;
 	while (left && !td->terminate) {
@@ -243,6 +247,11 @@ static int pre_read_file(struct thread_data *td, struct fio_file *f)
 
 	bs = td->o.max_bs[DDIR_READ];
 	b = malloc(bs);
+	if (!b) {
+		td_verror(td, errno, "malloc");
+		ret = 1;
+		goto error;
+	}
 	memset(b, 0, bs);
 
 	if (lseek(f->fd, f->file_offset, SEEK_SET) < 0) {
-- 
2.9.3



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 04/13] Don't malloc more than necessary on extending/prereading file
  2017-03-28 20:02 [PATCH 01/13] Fix return value of make_filename() when no filename_format kusumi.tomohiro
  2017-03-28 20:02 ` [PATCH 02/13] Use GOLDEN_RATIO_PRIME kusumi.tomohiro
  2017-03-28 20:02 ` [PATCH 03/13] Test malloc result when allocation size is tunable kusumi.tomohiro
@ 2017-03-28 20:02 ` kusumi.tomohiro
  2017-03-28 20:02 ` [PATCH 05/13] HOWTO: Mention niche detail of range format options kusumi.tomohiro
                   ` (9 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: kusumi.tomohiro @ 2017-03-28 20:02 UTC (permalink / raw)
  To: axboe, fio; +Cc: Tomohiro Kusumi

From: Tomohiro Kusumi <tkusumi@tuxera.com>

If td->o.max_bs[DDIR_XXX] were larger than file size to extend/preread,
it only needs to malloc the file size.

Given that td->o.max_bs[DDIR_XXX] are tunable parameters, it's better
not to malloc whatever size specified if needed size is smaller than
that. Users could specify as large as maximum of uint.

I dropped "bs = td->o.max_bs[DDIR_WRITE];" inside the first while loop
since now it works the same with or without this.

(This commit directly goes on top of the previous one)

Signed-off-by: Tomohiro Kusumi <tkusumi@tuxera.com>
---
 filesetup.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/filesetup.c b/filesetup.c
index ce19cf0..9335dcd 100644
--- a/filesetup.c
+++ b/filesetup.c
@@ -159,15 +159,18 @@ static int extend_file(struct thread_data *td, struct fio_file *f)
 		}
 	}
 
-	b = malloc(td->o.max_bs[DDIR_WRITE]);
+	left = f->real_file_size;
+	bs = td->o.max_bs[DDIR_WRITE];
+	if (bs > left)
+		bs = left;
+
+	b = malloc(bs);
 	if (!b) {
 		td_verror(td, errno, "malloc");
 		goto err;
 	}
 
-	left = f->real_file_size;
 	while (left && !td->terminate) {
-		bs = td->o.max_bs[DDIR_WRITE];
 		if (bs > left)
 			bs = left;
 
@@ -245,7 +248,11 @@ static int pre_read_file(struct thread_data *td, struct fio_file *f)
 
 	old_runstate = td_bump_runstate(td, TD_PRE_READING);
 
+	left = f->io_size;
 	bs = td->o.max_bs[DDIR_READ];
+	if (bs > left)
+		bs = left;
+
 	b = malloc(bs);
 	if (!b) {
 		td_verror(td, errno, "malloc");
@@ -261,8 +268,6 @@ static int pre_read_file(struct thread_data *td, struct fio_file *f)
 		goto error;
 	}
 
-	left = f->io_size;
-
 	while (left && !td->terminate) {
 		if (bs > left)
 			bs = left;
-- 
2.9.3



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 05/13] HOWTO: Mention niche detail of range format options
  2017-03-28 20:02 [PATCH 01/13] Fix return value of make_filename() when no filename_format kusumi.tomohiro
                   ` (2 preceding siblings ...)
  2017-03-28 20:02 ` [PATCH 04/13] Don't malloc more than necessary on extending/prereading file kusumi.tomohiro
@ 2017-03-28 20:02 ` kusumi.tomohiro
  2017-03-28 20:02 ` [PATCH 06/13] Drop redundant "ignore invalidate option" message from 21c1b29e kusumi.tomohiro
                   ` (8 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: kusumi.tomohiro @ 2017-03-28 20:02 UTC (permalink / raw)
  To: axboe, fio; +Cc: Tomohiro Kusumi

From: Tomohiro Kusumi <tkusumi@tuxera.com>

Signed-off-by: Tomohiro Kusumi <tkusumi@tuxera.com>
---
 HOWTO | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/HOWTO b/HOWTO
index cae95b7..80b9e75 100644
--- a/HOWTO
+++ b/HOWTO
@@ -543,6 +543,8 @@ Parameter types
 
 	If the option accepts an upper and lower range, use a colon ':' or
 	minus '-' to separate such values. See :ref:`irange <irange>`.
+	If the lower value specified happens to be larger than the upper value,
+	two values are swapped.
 
 .. _bool:
 
-- 
2.9.3



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 06/13] Drop redundant "ignore invalidate option" message from 21c1b29e
  2017-03-28 20:02 [PATCH 01/13] Fix return value of make_filename() when no filename_format kusumi.tomohiro
                   ` (3 preceding siblings ...)
  2017-03-28 20:02 ` [PATCH 05/13] HOWTO: Mention niche detail of range format options kusumi.tomohiro
@ 2017-03-28 20:02 ` kusumi.tomohiro
  2017-03-28 20:02 ` [PATCH 07/13] Ignore pre-read for FIO_NOIO td kusumi.tomohiro
                   ` (7 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: kusumi.tomohiro @ 2017-03-28 20:02 UTC (permalink / raw)
  To: axboe, fio; +Cc: Tomohiro Kusumi

From: Tomohiro Kusumi <tkusumi@tuxera.com>

The message added by 21c1b29e ("fio: ignore invalidate option...")
is correct in the sense that it resets invalidate= option, however
since invalidation is enabled by default, this message appears whenever
pre_read=1 is set (unless invalidate=0 is also explicitly set at the
same time, which is unliekly).

This is annoying and shouldn't have been added. 21c1b29e updating
HOWTO was enough, sorry.

Signed-off-by: Tomohiro Kusumi <tkusumi@tuxera.com>
---
 init.c | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/init.c b/init.c
index eef5150..c29a1b4 100644
--- a/init.c
+++ b/init.c
@@ -766,11 +766,8 @@ static int fixup_options(struct thread_data *td)
 	}
 
 	if (o->pre_read) {
-		if (o->invalidate_cache) {
-			log_info("fio: ignore invalidate option for %s\n",
-				 o->name);
+		if (o->invalidate_cache)
 			o->invalidate_cache = 0;
-		}
 		if (td_ioengine_flagged(td, FIO_PIPEIO)) {
 			log_info("fio: cannot pre-read files with an IO engine"
 				 " that isn't seekable. Pre-read disabled.\n");
-- 
2.9.3



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 07/13] Ignore pre-read for FIO_NOIO td
  2017-03-28 20:02 [PATCH 01/13] Fix return value of make_filename() when no filename_format kusumi.tomohiro
                   ` (4 preceding siblings ...)
  2017-03-28 20:02 ` [PATCH 06/13] Drop redundant "ignore invalidate option" message from 21c1b29e kusumi.tomohiro
@ 2017-03-28 20:02 ` kusumi.tomohiro
  2017-03-28 20:02 ` [PATCH 08/13] Don't proceed with error set when failed to pre-read files/devices kusumi.tomohiro
                   ` (6 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: kusumi.tomohiro @ 2017-03-28 20:02 UTC (permalink / raw)
  To: axboe, fio; +Cc: Tomohiro Kusumi

From: Tomohiro Kusumi <tkusumi@tuxera.com>

pre_read_file() should ignore FIO_NOIO (i.e. cpuio) in addition to
FIO_PIPEIO. It does/should fail anyway since FIO_NOIO td is supposed
to have -1 for fd for not supporting any I/O.

Signed-off-by: Tomohiro Kusumi <tkusumi@tuxera.com>
---
 filesetup.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/filesetup.c b/filesetup.c
index 9335dcd..bd971e8 100644
--- a/filesetup.c
+++ b/filesetup.c
@@ -235,7 +235,8 @@ static int pre_read_file(struct thread_data *td, struct fio_file *f)
 	unsigned int bs;
 	char *b;
 
-	if (td_ioengine_flagged(td, FIO_PIPEIO))
+	if (td_ioengine_flagged(td, FIO_PIPEIO) ||
+	    td_ioengine_flagged(td, FIO_NOIO))
 		return 0;
 
 	if (!fio_file_open(f)) {
-- 
2.9.3



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 08/13] Don't proceed with error set when failed to pre-read files/devices
  2017-03-28 20:02 [PATCH 01/13] Fix return value of make_filename() when no filename_format kusumi.tomohiro
                   ` (5 preceding siblings ...)
  2017-03-28 20:02 ` [PATCH 07/13] Ignore pre-read for FIO_NOIO td kusumi.tomohiro
@ 2017-03-28 20:02 ` kusumi.tomohiro
  2017-03-28 20:02 ` [PATCH 09/13] Ignore pre-read for character devices kusumi.tomohiro
                   ` (5 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: kusumi.tomohiro @ 2017-03-28 20:02 UTC (permalink / raw)
  To: axboe, fio; +Cc: Tomohiro Kusumi

From: Tomohiro Kusumi <tkusumi@tuxera.com>

pre_read_files() never fails (never returns negative), and because
of this behavior, fio threads can continue regardless of td_verror()
call while prereading, and results in statistics with error in it,
which is quite confusing as to how it should be interpreted for regular
users.

This commit makes pre_read_files() return -1 if preread fails, and
eventually aborts fio, which is also the case with some other options.
It also changes non error return from 1 to 0, since all it matters
is if it's <0 or not, and fio normally uses 0 for success.

Not sure what the proper way of fixing this is if it legitimately
failed for some error on prereading though. Some options just print
a message to indicate it's unsupported and continue normally withtout
any error set.

Signed-off-by: Tomohiro Kusumi <tkusumi@tuxera.com>
---
 filesetup.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/filesetup.c b/filesetup.c
index bd971e8..cd486ea 100644
--- a/filesetup.c
+++ b/filesetup.c
@@ -1119,10 +1119,11 @@ int pre_read_files(struct thread_data *td)
 	dprint(FD_FILE, "pre_read files\n");
 
 	for_each_file(td, f, i) {
-		pre_read_file(td, f);
+		if (pre_read_file(td, f))
+			return -1;
 	}
 
-	return 1;
+	return 0;
 }
 
 static int __init_rand_distribution(struct thread_data *td, struct fio_file *f)
-- 
2.9.3



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 09/13] Ignore pre-read for character devices
  2017-03-28 20:02 [PATCH 01/13] Fix return value of make_filename() when no filename_format kusumi.tomohiro
                   ` (6 preceding siblings ...)
  2017-03-28 20:02 ` [PATCH 08/13] Don't proceed with error set when failed to pre-read files/devices kusumi.tomohiro
@ 2017-03-28 20:02 ` kusumi.tomohiro
  2017-03-28 20:02 ` [PATCH 10/13] Drop prototype of unused function td_io_sync() kusumi.tomohiro
                   ` (4 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: kusumi.tomohiro @ 2017-03-28 20:02 UTC (permalink / raw)
  To: axboe, fio; +Cc: Tomohiro Kusumi

From: Tomohiro Kusumi <tkusumi@tuxera.com>

pre_read_file() could ignore a chrdev due to its purpose of providing
unbuffered access to devices not limited to seekable disk devices,
while the purpose of this function (i.e. pre_read= option) is to
lseek(2) the given offset and page cache whatever read via read(2)
which is basically for filesystems and blkdevs.

(This commit directly goes on top of the one before previous one)

Signed-off-by: Tomohiro Kusumi <tkusumi@tuxera.com>
---
 filesetup.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/filesetup.c b/filesetup.c
index cd486ea..612e794 100644
--- a/filesetup.c
+++ b/filesetup.c
@@ -239,6 +239,9 @@ static int pre_read_file(struct thread_data *td, struct fio_file *f)
 	    td_ioengine_flagged(td, FIO_NOIO))
 		return 0;
 
+	if (f->filetype == FIO_TYPE_CHAR)
+		return 0;
+
 	if (!fio_file_open(f)) {
 		if (td->io_ops->open_file(td, f)) {
 			log_err("fio: cannot pre-read, failed to open file\n");
-- 
2.9.3



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 10/13] Drop prototype of unused function td_io_sync()
  2017-03-28 20:02 [PATCH 01/13] Fix return value of make_filename() when no filename_format kusumi.tomohiro
                   ` (7 preceding siblings ...)
  2017-03-28 20:02 ` [PATCH 09/13] Ignore pre-read for character devices kusumi.tomohiro
@ 2017-03-28 20:02 ` kusumi.tomohiro
  2017-03-28 20:02 ` [PATCH 11/13] Separate io_u from ioengine [1/3] - add io_u.h kusumi.tomohiro
                   ` (3 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: kusumi.tomohiro @ 2017-03-28 20:02 UTC (permalink / raw)
  To: axboe, fio; +Cc: Tomohiro Kusumi

From: Tomohiro Kusumi <tkusumi@tuxera.com>

858a3d47 in 2006 has removed (actually renamed) this function,
so this prototype hasn't been used since then.

Signed-off-by: Tomohiro Kusumi <tkusumi@tuxera.com>
---
 ioengine.h | 1 -
 1 file changed, 1 deletion(-)

diff --git a/ioengine.h b/ioengine.h
index 7249df6..dc2c269 100644
--- a/ioengine.h
+++ b/ioengine.h
@@ -190,7 +190,6 @@ typedef void (*get_ioengine_t)(struct ioengine_ops **);
 extern int __must_check td_io_init(struct thread_data *);
 extern int __must_check td_io_prep(struct thread_data *, struct io_u *);
 extern int __must_check td_io_queue(struct thread_data *, struct io_u *);
-extern int __must_check td_io_sync(struct thread_data *, struct fio_file *);
 extern int __must_check td_io_getevents(struct thread_data *, unsigned int, unsigned int, const struct timespec *);
 extern int __must_check td_io_commit(struct thread_data *);
 extern int __must_check td_io_open_file(struct thread_data *, struct fio_file *);
-- 
2.9.3



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 11/13] Separate io_u from ioengine [1/3] - add io_u.h
  2017-03-28 20:02 [PATCH 01/13] Fix return value of make_filename() when no filename_format kusumi.tomohiro
                   ` (8 preceding siblings ...)
  2017-03-28 20:02 ` [PATCH 10/13] Drop prototype of unused function td_io_sync() kusumi.tomohiro
@ 2017-03-28 20:02 ` kusumi.tomohiro
  2017-03-28 20:03 ` [PATCH 12/13] Separate io_u from ioengine [2/3] - move io_u functions kusumi.tomohiro
                   ` (2 subsequent siblings)
  12 siblings, 0 replies; 17+ messages in thread
From: kusumi.tomohiro @ 2017-03-28 20:02 UTC (permalink / raw)
  To: axboe, fio; +Cc: Tomohiro Kusumi

From: Tomohiro Kusumi <tkusumi@tuxera.com>

Extract io_u related structures and functions from ioengine.h to
a new header io_u.h which is intended to be a header for io_u.c
(similar to the way there is io_u_queue.h for io_u_queue.c),
since there isn't much reason for them to be a part of ioengine.h.

This commit does nothing other than separating them out (and make
other related files include the new header).

Confirmed this compiles on Linux, Cygwin and several BSDs.

Signed-off-by: Tomohiro Kusumi <tkusumi@tuxera.com>
---
 fio.h      |   1 +
 io_u.h     | 179 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ioengine.h | 172 +---------------------------------------------------------
 3 files changed, 181 insertions(+), 171 deletions(-)
 create mode 100644 io_u.h

diff --git a/fio.h b/fio.h
index 52a9b75..806f7ed 100644
--- a/fio.h
+++ b/fio.h
@@ -39,6 +39,7 @@
 #include "server.h"
 #include "stat.h"
 #include "flow.h"
+#include "io_u.h"
 #include "io_u_queue.h"
 #include "workqueue.h"
 #include "steadystate.h"
diff --git a/io_u.h b/io_u.h
new file mode 100644
index 0000000..155344d
--- /dev/null
+++ b/io_u.h
@@ -0,0 +1,179 @@
+#ifndef FIO_IO_U
+#define FIO_IO_U
+
+#include "compiler/compiler.h"
+#include "os/os.h"
+#include "log.h"
+#include "io_ddir.h"
+#include "debug.h"
+#include "file.h"
+#include "workqueue.h"
+
+#ifdef CONFIG_LIBAIO
+#include <libaio.h>
+#endif
+#ifdef CONFIG_GUASI
+#include <guasi.h>
+#endif
+
+enum {
+	IO_U_F_FREE		= 1 << 0,
+	IO_U_F_FLIGHT		= 1 << 1,
+	IO_U_F_NO_FILE_PUT	= 1 << 2,
+	IO_U_F_IN_CUR_DEPTH	= 1 << 3,
+	IO_U_F_BUSY_OK		= 1 << 4,
+	IO_U_F_TRIMMED		= 1 << 5,
+	IO_U_F_BARRIER		= 1 << 6,
+	IO_U_F_VER_LIST		= 1 << 7,
+};
+
+/*
+ * The io unit
+ */
+struct io_u {
+	struct timeval start_time;
+	struct timeval issue_time;
+
+	struct fio_file *file;
+	unsigned int flags;
+	enum fio_ddir ddir;
+
+	/*
+	 * For replay workloads, we may want to account as a different
+	 * IO type than what is being submitted.
+	 */
+	enum fio_ddir acct_ddir;
+
+	/*
+	 * Write generation
+	 */
+	unsigned short numberio;
+
+	/*
+	 * Allocated/set buffer and length
+	 */
+	unsigned long buflen;
+	unsigned long long offset;
+	void *buf;
+
+	/*
+	 * Initial seed for generating the buffer contents
+	 */
+	uint64_t rand_seed;
+
+	/*
+	 * IO engine state, may be different from above when we get
+	 * partial transfers / residual data counts
+	 */
+	void *xfer_buf;
+	unsigned long xfer_buflen;
+
+	/*
+	 * Parameter related to pre-filled buffers and
+	 * their size to handle variable block sizes.
+	 */
+	unsigned long buf_filled_len;
+
+	struct io_piece *ipo;
+
+	unsigned int resid;
+	unsigned int error;
+
+	/*
+	 * io engine private data
+	 */
+	union {
+		unsigned int index;
+		unsigned int seen;
+		void *engine_data;
+	};
+
+	union {
+		struct flist_head verify_list;
+		struct workqueue_work work;
+	};
+
+	/*
+	 * Callback for io completion
+	 */
+	int (*end_io)(struct thread_data *, struct io_u **);
+
+	union {
+#ifdef CONFIG_LIBAIO
+		struct iocb iocb;
+#endif
+#ifdef CONFIG_POSIXAIO
+		os_aiocb_t aiocb;
+#endif
+#ifdef FIO_HAVE_SGIO
+		struct sg_io_hdr hdr;
+#endif
+#ifdef CONFIG_GUASI
+		guasi_req_t greq;
+#endif
+#ifdef CONFIG_SOLARISAIO
+		aio_result_t resultp;
+#endif
+#ifdef FIO_HAVE_BINJECT
+		struct b_user_cmd buc;
+#endif
+#ifdef CONFIG_RDMA
+		struct ibv_mr *mr;
+#endif
+		void *mmap_data;
+	};
+};
+
+/*
+ * io unit handling
+ */
+extern struct io_u *__get_io_u(struct thread_data *);
+extern struct io_u *get_io_u(struct thread_data *);
+extern void put_io_u(struct thread_data *, struct io_u *);
+extern void clear_io_u(struct thread_data *, struct io_u *);
+extern void requeue_io_u(struct thread_data *, struct io_u **);
+extern int __must_check io_u_sync_complete(struct thread_data *, struct io_u *);
+extern int __must_check io_u_queued_complete(struct thread_data *, int);
+extern void io_u_queued(struct thread_data *, struct io_u *);
+extern int io_u_quiesce(struct thread_data *);
+extern void io_u_log_error(struct thread_data *, struct io_u *);
+extern void io_u_mark_depth(struct thread_data *, unsigned int);
+extern void fill_io_buffer(struct thread_data *, void *, unsigned int, unsigned int);
+extern void io_u_fill_buffer(struct thread_data *td, struct io_u *, unsigned int, unsigned int);
+void io_u_mark_complete(struct thread_data *, unsigned int);
+void io_u_mark_submit(struct thread_data *, unsigned int);
+bool queue_full(const struct thread_data *);
+
+int do_io_u_sync(const struct thread_data *, struct io_u *);
+int do_io_u_trim(const struct thread_data *, struct io_u *);
+
+#ifdef FIO_INC_DEBUG
+static inline void dprint_io_u(struct io_u *io_u, const char *p)
+{
+	struct fio_file *f = io_u->file;
+
+	dprint(FD_IO, "%s: io_u %p: off=%llu/len=%lu/ddir=%d", p, io_u,
+					(unsigned long long) io_u->offset,
+					io_u->buflen, io_u->ddir);
+	if (f)
+		dprint(FD_IO, "/%s", f->file_name);
+	dprint(FD_IO, "\n");
+}
+#else
+#define dprint_io_u(io_u, p)
+#endif
+
+static inline enum fio_ddir acct_ddir(struct io_u *io_u)
+{
+	if (io_u->acct_ddir != -1)
+		return io_u->acct_ddir;
+
+	return io_u->ddir;
+}
+
+#define io_u_clear(td, io_u, val)	\
+	td_flags_clear((td), &(io_u->flags), (val))
+#define io_u_set(td, io_u, val)		\
+	td_flags_set((td), &(io_u)->flags, (val))
+
+#endif
diff --git a/ioengine.h b/ioengine.h
index dc2c269..f24f4df 100644
--- a/ioengine.h
+++ b/ioengine.h
@@ -3,129 +3,11 @@
 
 #include "compiler/compiler.h"
 #include "os/os.h"
-#include "log.h"
-#include "io_ddir.h"
-#include "debug.h"
 #include "file.h"
-#include "workqueue.h"
-
-#ifdef CONFIG_LIBAIO
-#include <libaio.h>
-#endif
-#ifdef CONFIG_GUASI
-#include <guasi.h>
-#endif
+#include "io_u.h"
 
 #define FIO_IOOPS_VERSION	23
 
-enum {
-	IO_U_F_FREE		= 1 << 0,
-	IO_U_F_FLIGHT		= 1 << 1,
-	IO_U_F_NO_FILE_PUT	= 1 << 2,
-	IO_U_F_IN_CUR_DEPTH	= 1 << 3,
-	IO_U_F_BUSY_OK		= 1 << 4,
-	IO_U_F_TRIMMED		= 1 << 5,
-	IO_U_F_BARRIER		= 1 << 6,
-	IO_U_F_VER_LIST		= 1 << 7,
-};
-
-/*
- * The io unit
- */
-struct io_u {
-	struct timeval start_time;
-	struct timeval issue_time;
-
-	struct fio_file *file;
-	unsigned int flags;
-	enum fio_ddir ddir;
-
-	/*
-	 * For replay workloads, we may want to account as a different
-	 * IO type than what is being submitted.
-	 */
-	enum fio_ddir acct_ddir;
-
-	/*
-	 * Write generation
-	 */
-	unsigned short numberio;
-
-	/*
-	 * Allocated/set buffer and length
-	 */
-	unsigned long buflen;
-	unsigned long long offset;
-	void *buf;
-
-	/*
-	 * Initial seed for generating the buffer contents
-	 */
-	uint64_t rand_seed;
-
-	/*
-	 * IO engine state, may be different from above when we get
-	 * partial transfers / residual data counts
-	 */
-	void *xfer_buf;
-	unsigned long xfer_buflen;
-
-	/*
-	 * Parameter related to pre-filled buffers and
-	 * their size to handle variable block sizes.
-	 */
-	unsigned long buf_filled_len;
-
-	struct io_piece *ipo;
-
-	unsigned int resid;
-	unsigned int error;
-
-	/*
-	 * io engine private data
-	 */
-	union {
-		unsigned int index;
-		unsigned int seen;
-		void *engine_data;
-	};
-
-	union {
-		struct flist_head verify_list;
-		struct workqueue_work work;
-	};
-
-	/*
-	 * Callback for io completion
-	 */
-	int (*end_io)(struct thread_data *, struct io_u **);
-
-	union {
-#ifdef CONFIG_LIBAIO
-		struct iocb iocb;
-#endif
-#ifdef CONFIG_POSIXAIO
-		os_aiocb_t aiocb;
-#endif
-#ifdef FIO_HAVE_SGIO
-		struct sg_io_hdr hdr;
-#endif
-#ifdef CONFIG_GUASI
-		guasi_req_t greq;
-#endif
-#ifdef CONFIG_SOLARISAIO
-		aio_result_t resultp;
-#endif
-#ifdef FIO_HAVE_BINJECT
-		struct b_user_cmd buc;
-#endif
-#ifdef CONFIG_RDMA
-		struct ibv_mr *mr;
-#endif
-		void *mmap_data;
-	};
-};
-
 /*
  * io_ops->queue() return values
  */
@@ -205,56 +87,4 @@ extern void close_ioengine(struct thread_data *);
 
 extern int fio_show_ioengine_help(const char *engine);
 
-/*
- * io unit handling
- */
-extern struct io_u *__get_io_u(struct thread_data *);
-extern struct io_u *get_io_u(struct thread_data *);
-extern void put_io_u(struct thread_data *, struct io_u *);
-extern void clear_io_u(struct thread_data *, struct io_u *);
-extern void requeue_io_u(struct thread_data *, struct io_u **);
-extern int __must_check io_u_sync_complete(struct thread_data *, struct io_u *);
-extern int __must_check io_u_queued_complete(struct thread_data *, int);
-extern void io_u_queued(struct thread_data *, struct io_u *);
-extern int io_u_quiesce(struct thread_data *);
-extern void io_u_log_error(struct thread_data *, struct io_u *);
-extern void io_u_mark_depth(struct thread_data *, unsigned int);
-extern void fill_io_buffer(struct thread_data *, void *, unsigned int, unsigned int);
-extern void io_u_fill_buffer(struct thread_data *td, struct io_u *, unsigned int, unsigned int);
-void io_u_mark_complete(struct thread_data *, unsigned int);
-void io_u_mark_submit(struct thread_data *, unsigned int);
-bool queue_full(const struct thread_data *);
-
-int do_io_u_sync(const struct thread_data *, struct io_u *);
-int do_io_u_trim(const struct thread_data *, struct io_u *);
-
-#ifdef FIO_INC_DEBUG
-static inline void dprint_io_u(struct io_u *io_u, const char *p)
-{
-	struct fio_file *f = io_u->file;
-
-	dprint(FD_IO, "%s: io_u %p: off=%llu/len=%lu/ddir=%d", p, io_u,
-					(unsigned long long) io_u->offset,
-					io_u->buflen, io_u->ddir);
-	if (f)
-		dprint(FD_IO, "/%s", f->file_name);
-	dprint(FD_IO, "\n");
-}
-#else
-#define dprint_io_u(io_u, p)
-#endif
-
-static inline enum fio_ddir acct_ddir(struct io_u *io_u)
-{
-	if (io_u->acct_ddir != -1)
-		return io_u->acct_ddir;
-
-	return io_u->ddir;
-}
-
-#define io_u_clear(td, io_u, val)	\
-	td_flags_clear((td), &(io_u->flags), (val))
-#define io_u_set(td, io_u, val)		\
-	td_flags_set((td), &(io_u)->flags, (val))
-
 #endif
-- 
2.9.3



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 12/13] Separate io_u from ioengine [2/3] - move io_u functions
  2017-03-28 20:02 [PATCH 01/13] Fix return value of make_filename() when no filename_format kusumi.tomohiro
                   ` (9 preceding siblings ...)
  2017-03-28 20:02 ` [PATCH 11/13] Separate io_u from ioengine [1/3] - add io_u.h kusumi.tomohiro
@ 2017-03-28 20:03 ` kusumi.tomohiro
  2017-03-28 20:03 ` [PATCH 13/13] Separate io_u from ioengine [3/3] - rename ioengine.h to ioengines.h kusumi.tomohiro
  2017-03-28 21:14 ` [PATCH 01/13] Fix return value of make_filename() when no filename_format Jens Axboe
  12 siblings, 0 replies; 17+ messages in thread
From: kusumi.tomohiro @ 2017-03-28 20:03 UTC (permalink / raw)
  To: axboe, fio; +Cc: Tomohiro Kusumi

From: Tomohiro Kusumi <tkusumi@tuxera.com>

Move io_u functions from ioengines.c to io_u.c whose prototypes
are now located in io_u.h after the previous commit.

Prior to the previous commit, ioengine.h originally separated io_u
related function prototypes and ioengine related function prototypes
(by comment) based on whether they invoke struct ioengine_ops member
functions or not. Prototypes for these two functions have existed
in io_u side, thus they should be moved to io_u.c respectively.

Signed-off-by: Tomohiro Kusumi <tkusumi@tuxera.com>
---
 io_u.c      | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ioengines.c | 58 ----------------------------------------------------------
 2 files changed, 58 insertions(+), 58 deletions(-)

diff --git a/io_u.c b/io_u.c
index c6d814b..363bfe1 100644
--- a/io_u.c
+++ b/io_u.c
@@ -2087,3 +2087,61 @@ void io_u_fill_buffer(struct thread_data *td, struct io_u *io_u,
 	io_u->buf_filled_len = 0;
 	fill_io_buffer(td, io_u->buf, min_write, max_bs);
 }
+
+static int do_sync_file_range(const struct thread_data *td,
+			      struct fio_file *f)
+{
+	off64_t offset, nbytes;
+
+	offset = f->first_write;
+	nbytes = f->last_write - f->first_write;
+
+	if (!nbytes)
+		return 0;
+
+	return sync_file_range(f->fd, offset, nbytes, td->o.sync_file_range);
+}
+
+int do_io_u_sync(const struct thread_data *td, struct io_u *io_u)
+{
+	int ret;
+
+	if (io_u->ddir == DDIR_SYNC) {
+		ret = fsync(io_u->file->fd);
+	} else if (io_u->ddir == DDIR_DATASYNC) {
+#ifdef CONFIG_FDATASYNC
+		ret = fdatasync(io_u->file->fd);
+#else
+		ret = io_u->xfer_buflen;
+		io_u->error = EINVAL;
+#endif
+	} else if (io_u->ddir == DDIR_SYNC_FILE_RANGE)
+		ret = do_sync_file_range(td, io_u->file);
+	else {
+		ret = io_u->xfer_buflen;
+		io_u->error = EINVAL;
+	}
+
+	if (ret < 0)
+		io_u->error = errno;
+
+	return ret;
+}
+
+int do_io_u_trim(const struct thread_data *td, struct io_u *io_u)
+{
+#ifndef FIO_HAVE_TRIM
+	io_u->error = EINVAL;
+	return 0;
+#else
+	struct fio_file *f = io_u->file;
+	int ret;
+
+	ret = os_trim(f->fd, io_u->offset, io_u->xfer_buflen);
+	if (!ret)
+		return io_u->xfer_buflen;
+
+	io_u->error = ret;
+	return 0;
+#endif
+}
diff --git a/ioengines.c b/ioengines.c
index c773f2e..c90a2ca 100644
--- a/ioengines.c
+++ b/ioengines.c
@@ -556,64 +556,6 @@ int td_io_get_file_size(struct thread_data *td, struct fio_file *f)
 	return td->io_ops->get_file_size(td, f);
 }
 
-static int do_sync_file_range(const struct thread_data *td,
-			      struct fio_file *f)
-{
-	off64_t offset, nbytes;
-
-	offset = f->first_write;
-	nbytes = f->last_write - f->first_write;
-
-	if (!nbytes)
-		return 0;
-
-	return sync_file_range(f->fd, offset, nbytes, td->o.sync_file_range);
-}
-
-int do_io_u_sync(const struct thread_data *td, struct io_u *io_u)
-{
-	int ret;
-
-	if (io_u->ddir == DDIR_SYNC) {
-		ret = fsync(io_u->file->fd);
-	} else if (io_u->ddir == DDIR_DATASYNC) {
-#ifdef CONFIG_FDATASYNC
-		ret = fdatasync(io_u->file->fd);
-#else
-		ret = io_u->xfer_buflen;
-		io_u->error = EINVAL;
-#endif
-	} else if (io_u->ddir == DDIR_SYNC_FILE_RANGE)
-		ret = do_sync_file_range(td, io_u->file);
-	else {
-		ret = io_u->xfer_buflen;
-		io_u->error = EINVAL;
-	}
-
-	if (ret < 0)
-		io_u->error = errno;
-
-	return ret;
-}
-
-int do_io_u_trim(const struct thread_data *td, struct io_u *io_u)
-{
-#ifndef FIO_HAVE_TRIM
-	io_u->error = EINVAL;
-	return 0;
-#else
-	struct fio_file *f = io_u->file;
-	int ret;
-
-	ret = os_trim(f->fd, io_u->offset, io_u->xfer_buflen);
-	if (!ret)
-		return io_u->xfer_buflen;
-
-	io_u->error = ret;
-	return 0;
-#endif
-}
-
 int fio_show_ioengine_help(const char *engine)
 {
 	struct flist_head *entry;
-- 
2.9.3



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* [PATCH 13/13] Separate io_u from ioengine [3/3] - rename ioengine.h to ioengines.h
  2017-03-28 20:02 [PATCH 01/13] Fix return value of make_filename() when no filename_format kusumi.tomohiro
                   ` (10 preceding siblings ...)
  2017-03-28 20:03 ` [PATCH 12/13] Separate io_u from ioengine [2/3] - move io_u functions kusumi.tomohiro
@ 2017-03-28 20:03 ` kusumi.tomohiro
  2017-03-28 21:14 ` [PATCH 01/13] Fix return value of make_filename() when no filename_format Jens Axboe
  12 siblings, 0 replies; 17+ messages in thread
From: kusumi.tomohiro @ 2017-03-28 20:03 UTC (permalink / raw)
  To: axboe, fio; +Cc: Tomohiro Kusumi

From: Tomohiro Kusumi <tkusumi@tuxera.com>

This is based on the previous commits which added a new header
io_u.h and separated io_u related from ioengine.h and ioengines.c.

Since now that ioengine.h and ioengines.c are 1:1 in their contents
(i.e. prototypes and implementation), they should be based on the
same name as well.

This could possibly break outbox ioengines if they include ioengine.h,
but all the inbox ones just include fio.h (probably because that's
what engines/skeleton_external.c does), so the impact is probably
limited, and fio doesn't guarantee anything to outbox ones anyway.

Signed-off-by: Tomohiro Kusumi <tkusumi@tuxera.com>
---
 fio.h                     | 2 +-
 ioengine.h => ioengines.h | 0
 iolog.h                   | 2 +-
 rate-submit.c             | 2 +-
 4 files changed, 3 insertions(+), 3 deletions(-)
 rename ioengine.h => ioengines.h (100%)

diff --git a/fio.h b/fio.h
index 806f7ed..3955a81 100644
--- a/fio.h
+++ b/fio.h
@@ -25,7 +25,7 @@
 #include "debug.h"
 #include "file.h"
 #include "io_ddir.h"
-#include "ioengine.h"
+#include "ioengines.h"
 #include "iolog.h"
 #include "helpers.h"
 #include "options.h"
diff --git a/ioengine.h b/ioengines.h
similarity index 100%
rename from ioengine.h
rename to ioengines.h
diff --git a/iolog.h b/iolog.h
index 37f27bc..0733ad3 100644
--- a/iolog.h
+++ b/iolog.h
@@ -4,7 +4,7 @@
 #include "lib/rbtree.h"
 #include "lib/ieee754.h"
 #include "flist.h"
-#include "ioengine.h"
+#include "ioengines.h"
 
 /*
  * Use for maintaining statistics
diff --git a/rate-submit.c b/rate-submit.c
index 4738dc4..fdbece6 100644
--- a/rate-submit.c
+++ b/rate-submit.c
@@ -5,7 +5,7 @@
  *
  */
 #include "fio.h"
-#include "ioengine.h"
+#include "ioengines.h"
 #include "lib/getrusage.h"
 #include "rate-submit.h"
 
-- 
2.9.3



^ permalink raw reply related	[flat|nested] 17+ messages in thread

* Re: [PATCH 02/13] Use GOLDEN_RATIO_PRIME
  2017-03-28 20:02 ` [PATCH 02/13] Use GOLDEN_RATIO_PRIME kusumi.tomohiro
@ 2017-03-28 20:44   ` Jens Axboe
  2017-03-28 21:17     ` Tomohiro Kusumi
  0 siblings, 1 reply; 17+ messages in thread
From: Jens Axboe @ 2017-03-28 20:44 UTC (permalink / raw)
  To: kusumi.tomohiro, fio; +Cc: Tomohiro Kusumi

On 03/28/2017 02:02 PM, kusumi.tomohiro@gmail.com wrote:
> From: Tomohiro Kusumi <tkusumi@tuxera.com>
> 
> Using this macro (originally for hash in Linux kernel) for rand seed
> instead of hard-coded value should make sense. rdma ioengine uses
> this for the seed as well.

This will change the seed behavior for 64-bit builds. I don't think
we should do that in the name of a cleanup.

-- 
Jens Axboe



^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 01/13] Fix return value of make_filename() when no filename_format
  2017-03-28 20:02 [PATCH 01/13] Fix return value of make_filename() when no filename_format kusumi.tomohiro
                   ` (11 preceding siblings ...)
  2017-03-28 20:03 ` [PATCH 13/13] Separate io_u from ioengine [3/3] - rename ioengine.h to ioengines.h kusumi.tomohiro
@ 2017-03-28 21:14 ` Jens Axboe
  12 siblings, 0 replies; 17+ messages in thread
From: Jens Axboe @ 2017-03-28 21:14 UTC (permalink / raw)
  To: kusumi.tomohiro; +Cc: fio, Tomohiro Kusumi

On Tue, Mar 28 2017, kusumi.tomohiro@gmail.com wrote:
> From: Tomohiro Kusumi <tkusumi@tuxera.com>
> 
> This is unlikely to happen in the first place since ->filename_format
> has a default value, and option parser can also detect an empty string,
> but it should return buf which is sprintf'd right before returning.
> 
> A caller expects this function to return filename string (which is
> buf arg itself in this case), and it also doesn't handle NULL return.

Applied 1, and 3-13. Thanks!

-- 
Jens Axboe



^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 02/13] Use GOLDEN_RATIO_PRIME
  2017-03-28 20:44   ` Jens Axboe
@ 2017-03-28 21:17     ` Tomohiro Kusumi
  2017-03-28 21:19       ` Jens Axboe
  0 siblings, 1 reply; 17+ messages in thread
From: Tomohiro Kusumi @ 2017-03-28 21:17 UTC (permalink / raw)
  To: Jens Axboe; +Cc: fio, Tomohiro Kusumi

Hi

Sorry, I thought using 64bit version on 64bit was the intention..

2017-03-28 23:44 GMT+03:00 Jens Axboe <axboe@kernel.dk>:
> On 03/28/2017 02:02 PM, kusumi.tomohiro@gmail.com wrote:
>> From: Tomohiro Kusumi <tkusumi@tuxera.com>
>>
>> Using this macro (originally for hash in Linux kernel) for rand seed
>> instead of hard-coded value should make sense. rdma ioengine uses
>> this for the seed as well.
>
> This will change the seed behavior for 64-bit builds. I don't think
> we should do that in the name of a cleanup.
>
> --
> Jens Axboe
>


^ permalink raw reply	[flat|nested] 17+ messages in thread

* Re: [PATCH 02/13] Use GOLDEN_RATIO_PRIME
  2017-03-28 21:17     ` Tomohiro Kusumi
@ 2017-03-28 21:19       ` Jens Axboe
  0 siblings, 0 replies; 17+ messages in thread
From: Jens Axboe @ 2017-03-28 21:19 UTC (permalink / raw)
  To: Tomohiro Kusumi; +Cc: fio, Tomohiro Kusumi

On 03/28/2017 03:17 PM, Tomohiro Kusumi wrote:
> Hi
> 
> Sorry, I thought using 64bit version on 64bit was the intention..

It would certainly have been nicer from the get-go, but it's not
what we currently have. And I don't want to change seeds just
because. If we were changing them, using the better:

#define GOLDEN_RATIO_32 0x61C88647
#define GOLDEN_RATIO_64 0x61C8864680B583EBull

would be the way to go, though.

-- 
Jens Axboe



^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2017-03-28 21:19 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-03-28 20:02 [PATCH 01/13] Fix return value of make_filename() when no filename_format kusumi.tomohiro
2017-03-28 20:02 ` [PATCH 02/13] Use GOLDEN_RATIO_PRIME kusumi.tomohiro
2017-03-28 20:44   ` Jens Axboe
2017-03-28 21:17     ` Tomohiro Kusumi
2017-03-28 21:19       ` Jens Axboe
2017-03-28 20:02 ` [PATCH 03/13] Test malloc result when allocation size is tunable kusumi.tomohiro
2017-03-28 20:02 ` [PATCH 04/13] Don't malloc more than necessary on extending/prereading file kusumi.tomohiro
2017-03-28 20:02 ` [PATCH 05/13] HOWTO: Mention niche detail of range format options kusumi.tomohiro
2017-03-28 20:02 ` [PATCH 06/13] Drop redundant "ignore invalidate option" message from 21c1b29e kusumi.tomohiro
2017-03-28 20:02 ` [PATCH 07/13] Ignore pre-read for FIO_NOIO td kusumi.tomohiro
2017-03-28 20:02 ` [PATCH 08/13] Don't proceed with error set when failed to pre-read files/devices kusumi.tomohiro
2017-03-28 20:02 ` [PATCH 09/13] Ignore pre-read for character devices kusumi.tomohiro
2017-03-28 20:02 ` [PATCH 10/13] Drop prototype of unused function td_io_sync() kusumi.tomohiro
2017-03-28 20:02 ` [PATCH 11/13] Separate io_u from ioengine [1/3] - add io_u.h kusumi.tomohiro
2017-03-28 20:03 ` [PATCH 12/13] Separate io_u from ioengine [2/3] - move io_u functions kusumi.tomohiro
2017-03-28 20:03 ` [PATCH 13/13] Separate io_u from ioengine [3/3] - rename ioengine.h to ioengines.h kusumi.tomohiro
2017-03-28 21:14 ` [PATCH 01/13] Fix return value of make_filename() when no filename_format Jens Axboe

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.