Merge branch 'o_dsync' of https://github.com/anarazel/fio
authorJens Axboe <axboe@kernel.dk>
Wed, 28 Oct 2020 22:20:43 +0000 (16:20 -0600)
committerJens Axboe <axboe@kernel.dk>
Wed, 28 Oct 2020 22:20:43 +0000 (16:20 -0600)
* 'o_dsync' of https://github.com/anarazel/fio:
  extend --sync to allow {sync,dsync,0,1}, to support O_DSYNC

HOWTO
engines/glusterfs.c
engines/ime.c
engines/libpmem.c
filesetup.c
fio.1
options.c

diff --git a/HOWTO b/HOWTO
index 2d8c7a0238fd20d77c1a1ee35e061ed16ab47cf8..386fd12aa7b14b80405a4df2851b3c0f7e967fd0 100644 (file)
--- a/HOWTO
+++ b/HOWTO
@@ -1677,10 +1677,28 @@ Buffers and memory
        This will be ignored if :option:`pre_read` is also specified for the
        same job.
 
-.. option:: sync=bool
+.. option:: sync=str
+
+       Whether, and what type, of synchronous I/O to use for writes.  The allowed
+       values are:
+
+               **none**
+                       Do not use synchronous IO, the default.
+
+               **0**
+                       Same as **none**.
+
+               **sync**
+                       Use synchronous file IO. For the majority of I/O engines,
+                       this means using O_SYNC.
+
+               **1**
+                       Same as **sync**.
+
+               **dsync**
+                       Use synchronous data IO. For the majority of I/O engines,
+                       this means using O_DSYNC.
 
-       Use synchronous I/O for buffered writes. For the majority of I/O engines,
-       this means using O_SYNC. Default: false.
 
 .. option:: iomem=str, mem=str
 
index f2b84a2ab70b00013d13aafdbbaa73fc385071bc..fc6fee193af71b7d97002a927791c0c9cf350b39 100644 (file)
@@ -271,8 +271,7 @@ int fio_gf_open_file(struct thread_data *td, struct fio_file *f)
 
        if (td->o.odirect)
                flags |= OS_O_DIRECT;
-       if (td->o.sync_io)
-               flags |= O_SYNC;
+       flags |= td->o.sync_io;
 
        dprint(FD_FILE, "fio file %s open mode %s td rw %s\n", f->file_name,
               flags & O_RDONLY ? "ro" : "rw", td_read(td) ? "read" : "write");
index 42984021ec9e808e39df9aa33c1faf23a169a4d9..440cc29e8e31bcfc9e0ce7a81a59410698925412 100644 (file)
@@ -194,8 +194,7 @@ static int fio_ime_open_file(struct thread_data *td, struct fio_file *f)
        }
        if (td->o.odirect)
                flags |= O_DIRECT;
-       if (td->o.sync_io)
-               flags |= O_SYNC;
+       flags |= td->o.sync_io;
        if (td->o.create_on_open && td->o.allow_create)
                flags |= O_CREAT;
 
index a9b3e29be662e208bd1578eb0209a3e4316ebfac..eefb7767f3eab953f202236a395b096ef8f67636 100644 (file)
@@ -193,6 +193,7 @@ static enum fio_q_status fio_libpmem_queue(struct thread_data *td,
 
        dprint(FD_IO, "DEBUG fio_libpmem_queue\n");
        dprint(FD_IO,"td->o.odirect %d td->o.sync_io %d \n",td->o.odirect, td->o.sync_io);
+       /* map both O_SYNC / DSYNC to not using NODRAIN */
        flags = td->o.sync_io ? 0 : PMEM_F_MEM_NODRAIN;
        flags |= td->o.odirect ? PMEM_F_MEM_NONTEMPORAL : PMEM_F_MEM_TEMPORAL;
 
index e44f31c716a63eb12440da37fd50d3552db39e10..f4360a6f78e1b241dd15f43e49ccb0ade39baa6f 100644 (file)
@@ -655,8 +655,7 @@ int generic_open_file(struct thread_data *td, struct fio_file *f)
                }
                flags |= OS_O_DIRECT | FIO_O_ATOMIC;
        }
-       if (td->o.sync_io)
-               flags |= O_SYNC;
+       flags |= td->o.sync_io;
        if (td->o.create_on_open && td->o.allow_create)
                flags |= O_CREAT;
 skip_flags:
diff --git a/fio.1 b/fio.1
index a881277c80279873f16414ce7a257fa5ab881bbd..481193254832befdd285394d6424c209b8805989 100644 (file)
--- a/fio.1
+++ b/fio.1
@@ -1462,9 +1462,31 @@ starting I/O if the platform and file type support it. Defaults to true.
 This will be ignored if \fBpre_read\fR is also specified for the
 same job.
 .TP
-.BI sync \fR=\fPbool
-Use synchronous I/O for buffered writes. For the majority of I/O engines,
-this means using O_SYNC. Default: false.
+.BI sync \fR=\fPstr
+Whether, and what type, of synchronous I/O to use for writes.  The allowed
+values are:
+.RS
+.RS
+.TP
+.B none
+Do not use synchronous IO, the default.
+.TP
+.B 0
+Same as \fBnone\fR.
+.TP
+.B sync
+Use synchronous file IO. For the majority of I/O engines,
+this means using O_SYNC.
+.TP
+.B 1
+Same as \fBsync\fR.
+.TP
+.B dsync
+Use synchronous data IO. For the majority of I/O engines,
+this means using O_DSYNC.
+.PD
+.RE
+.RE
 .TP
 .BI iomem \fR=\fPstr "\fR,\fP mem" \fR=\fPstr
 Fio can use various types of memory as the I/O unit buffer. The allowed
index b497d973eb03b12852d9ce499ab108ec24457f8f..1e91b3e9e23a79eb780b35c22e9cd7681e82ab58 100644 (file)
--- a/options.c
+++ b/options.c
@@ -3733,14 +3733,32 @@ struct fio_option fio_options[FIO_MAX_OPTS] = {
        {
                .name   = "sync",
                .lname  = "Synchronous I/O",
-               .type   = FIO_OPT_BOOL,
+               .type   = FIO_OPT_STR,
                .off1   = offsetof(struct thread_options, sync_io),
-               .help   = "Use O_SYNC for buffered writes",
-               .def    = "0",
-               .parent = "buffered",
+               .help   = "Use synchronous write IO",
+               .def    = "none",
                .hide   = 1,
                .category = FIO_OPT_C_IO,
                .group  = FIO_OPT_G_IO_TYPE,
+               .posval = {
+                         { .ival = "none",
+                           .oval = 0,
+                         },
+                         { .ival = "0",
+                           .oval = 0,
+                         },
+                         { .ival = "sync",
+                           .oval = O_SYNC,
+                         },
+                         { .ival = "1",
+                           .oval = O_SYNC,
+                         },
+#ifdef O_DSYNC
+                         { .ival = "dsync",
+                           .oval = O_DSYNC,
+                         },
+#endif
+               },
        },
 #ifdef FIO_HAVE_WRITE_HINT
        {