The following changes since commit aa7d2ef092d5a8e417fcddaf8808fb0d48f1064b: Added millisecond-accurate timestamp to JSON output (2016-05-27 14:26:16 -0400) are available in the git repository at: git://git.kernel.dk/fio.git master for you to fetch changes up to 385e1da6468bc951a0bf7ae60d890bb4d4a55ded: Documentation update (2016-06-02 16:57:20 -0600) ---------------------------------------------------------------- Jens Axboe (3): Enable preadv2/pwritev2 engines by default on Linux arch: wire up preadv2/pwritev2 for more architectures Documentation update Omar Sandoval (1): Fix iodepth_batch=0 HOWTO | 11 +++++------ arch/arch-arm.h | 7 +++++++ arch/arch-ia64.h | 7 +++++++ arch/arch-s390.h | 7 +++++++ arch/arch-sparc.h | 7 +++++++ arch/arch-sparc64.h | 7 +++++++ arch/arch-x86.h | 7 +++++++ arch/arch-x86_64.h | 8 ++++++++ engines/sync.c | 10 +++++----- fio.1 | 3 --- options.c | 3 +-- os/os-linux.h | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 12 files changed, 113 insertions(+), 16 deletions(-) --- Diff of recent changes: diff --git a/HOWTO b/HOWTO index cec4e42..1d4e46c 100644 --- a/HOWTO +++ b/HOWTO @@ -53,8 +53,8 @@ bottom, it contains the following basic parameters: IO engine How do we issue io? We could be memory mapping the file, we could be using regular read/write, we - could be using splice, async io, syslet, or even - SG (SCSI generic sg). + could be using splice, async io, or even SG + (SCSI generic sg). IO depth If the io engine is async, how large a queuing depth do we want to maintain? @@ -706,7 +706,9 @@ ioengine=str Defines how the job issues io to the file. The following vsync Basic readv(2) or writev(2) IO. - psyncv Basic preadv(2) or pwritev(2) IO. + pvsync Basic preadv(2) or pwritev(2) IO. + + psync2 Basic preadv2(2) or pwritev2(2) IO. libaio Linux native asynchronous io. Note that Linux may only support queued behaviour with @@ -726,9 +728,6 @@ ioengine=str Defines how the job issues io to the file. The following vmsplice(2) to transfer data from user space to the kernel. - syslet-rw Use the syslet system calls to make - regular read/write async. - sg SCSI generic sg v3 io. May either be synchronous using the SG_IO ioctl, or if the target is an sg character device diff --git a/arch/arch-arm.h b/arch/arch-arm.h index 93268d2..57d9488 100644 --- a/arch/arch-arm.h +++ b/arch/arch-arm.h @@ -18,6 +18,13 @@ #define __NR_sys_vmsplice 343 #endif +#ifndef __NR_preadv2 +#define __NR_preadv2 392 +#endif +#ifndef __NR_pwritev2 +#define __NR_pwritev2 393 +#endif + #if defined (__ARM_ARCH_4__) || defined (__ARM_ARCH_4T__) \ || defined (__ARM_ARCH_5__) || defined (__ARM_ARCH_5T__) || defined (__ARM_ARCH_5E__)\ || defined (__ARM_ARCH_5TE__) || defined (__ARM_ARCH_5TEJ__) \ diff --git a/arch/arch-ia64.h b/arch/arch-ia64.h index 8e8dd7f..7cdeefc 100644 --- a/arch/arch-ia64.h +++ b/arch/arch-ia64.h @@ -18,6 +18,13 @@ #define __NR_sys_vmsplice 1302 #endif +#ifndef __NR_preadv2 +#define __NR_preadv2 1348 +#endif +#ifndef __NR_pwritev2 +#define __NR_pwritev2 1349 +#endif + #define nop asm volatile ("hint @pause" ::: "memory"); #define read_barrier() asm volatile ("mf" ::: "memory") #define write_barrier() asm volatile ("mf" ::: "memory") diff --git a/arch/arch-s390.h b/arch/arch-s390.h index cc7a1d1..71beb7d 100644 --- a/arch/arch-s390.h +++ b/arch/arch-s390.h @@ -18,6 +18,13 @@ #define __NR_sys_vmsplice 309 #endif +#ifndef __NR_preadv2 +#define __NR_preadv2 376 +#endif +#ifndef __NR_pwritev2 +#define __NR_pwritev2 377 +#endif + #define nop asm volatile("nop" : : : "memory") #define read_barrier() asm volatile("bcr 15,0" : : : "memory") #define write_barrier() asm volatile("bcr 15,0" : : : "memory") diff --git a/arch/arch-sparc.h b/arch/arch-sparc.h index fe47b80..d0df883 100644 --- a/arch/arch-sparc.h +++ b/arch/arch-sparc.h @@ -18,6 +18,13 @@ #define __NR_sys_vmsplice 25 #endif +#ifndef __NR_preadv2 +#define __NR_preadv2 358 +#endif +#ifndef __NR_pwritev2 +#define __NR_pwritev2 359 +#endif + #define nop do { } while (0) #define read_barrier() __asm__ __volatile__ ("" : : : "memory") diff --git a/arch/arch-sparc64.h b/arch/arch-sparc64.h index e793ae5..5c4e649 100644 --- a/arch/arch-sparc64.h +++ b/arch/arch-sparc64.h @@ -18,6 +18,13 @@ #define __NR_sys_vmsplice 25 #endif +#ifndef __NR_preadv2 +#define __NR_preadv2 358 +#endif +#ifndef __NR_pwritev2 +#define __NR_pwritev2 359 +#endif + #define nop do { } while (0) #define membar_safe(type) \ diff --git a/arch/arch-x86.h b/arch/arch-x86.h index 385a912..9471a89 100644 --- a/arch/arch-x86.h +++ b/arch/arch-x86.h @@ -29,6 +29,13 @@ static inline void do_cpuid(unsigned int *eax, unsigned int *ebx, #define __NR_sys_vmsplice 316 #endif +#ifndef __NR_preadv2 +#define __NR_preadv2 378 +#endif +#ifndef __NR_pwritev2 +#define __NR_pwritev2 379 +#endif + #define FIO_HUGE_PAGE 4194304 #define nop __asm__ __volatile__("rep;nop": : :"memory") diff --git a/arch/arch-x86_64.h b/arch/arch-x86_64.h index 8f33fc5..21da412 100644 --- a/arch/arch-x86_64.h +++ b/arch/arch-x86_64.h @@ -36,6 +36,14 @@ static inline void do_cpuid(unsigned int *eax, unsigned int *ebx, #define __NR_shmdt 67 #endif +#ifndef __NR_preadv2 +#define __NR_preadv2 327 +#endif +#ifndef __NR_pwritev2 +#define __NR_pwritev2 328 +#endif + + #define FIO_HUGE_PAGE 2097152 #define nop __asm__ __volatile__("rep;nop": : :"memory") diff --git a/engines/sync.c b/engines/sync.c index 260ef66..433e4fa 100644 --- a/engines/sync.c +++ b/engines/sync.c @@ -32,7 +32,7 @@ struct syncio_data { enum fio_ddir last_ddir; }; -#ifdef CONFIG_PWRITEV2 +#ifdef FIO_HAVE_PWRITEV2 struct psyncv2_options { void *pad; unsigned int hipri; @@ -121,7 +121,7 @@ static int fio_pvsyncio_queue(struct thread_data *td, struct io_u *io_u) } #endif -#ifdef CONFIG_PWRITEV2 +#ifdef FIO_HAVE_PWRITEV2 static int fio_pvsyncio2_queue(struct thread_data *td, struct io_u *io_u) { struct syncio_data *sd = td->io_ops->data; @@ -429,7 +429,7 @@ static struct ioengine_ops ioengine_pvrw = { }; #endif -#ifdef CONFIG_PWRITEV2 +#ifdef FIO_HAVE_PWRITEV2 static struct ioengine_ops ioengine_pvrw2 = { .name = "pvsync2", .version = FIO_IOOPS_VERSION, @@ -453,7 +453,7 @@ static void fio_init fio_syncio_register(void) #ifdef CONFIG_PWRITEV register_ioengine(&ioengine_pvrw); #endif -#ifdef CONFIG_PWRITEV2 +#ifdef FIO_HAVE_PWRITEV2 register_ioengine(&ioengine_pvrw2); #endif } @@ -466,7 +466,7 @@ static void fio_exit fio_syncio_unregister(void) #ifdef CONFIG_PWRITEV unregister_ioengine(&ioengine_pvrw); #endif -#ifdef CONFIG_PWRITEV2 +#ifdef FIO_HAVE_PWRITEV2 unregister_ioengine(&ioengine_pvrw2); #endif } diff --git a/fio.1 b/fio.1 index f521c9d..7f053d4 100644 --- a/fio.1 +++ b/fio.1 @@ -633,9 +633,6 @@ File is memory mapped with \fBmmap\fR\|(2) and data copied using \fBsplice\fR\|(2) is used to transfer the data and \fBvmsplice\fR\|(2) to transfer data from user-space to the kernel. .TP -.B syslet-rw -Use the syslet system calls to make regular read/write asynchronous. -.TP .B sg SCSI generic sg v3 I/O. May be either synchronous using the SG_IO ioctl, or if the target is an sg character device, we use \fBread\fR\|(2) and diff --git a/options.c b/options.c index 3360784..7a22fe4 100644 --- a/options.c +++ b/options.c @@ -1548,7 +1548,7 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .help = "Use preadv/pwritev", }, #endif -#ifdef CONFIG_PWRITEV2 +#ifdef FIO_HAVE_PWRITEV2 { .ival = "pvsync2", .help = "Use preadv2/pwritev2", }, @@ -1678,7 +1678,6 @@ struct fio_option fio_options[FIO_MAX_OPTS] = { .help = "Number of IO buffers to submit in one go", .parent = "iodepth", .hide = 1, - .minval = 1, .interval = 1, .def = "1", .category = FIO_OPT_C_IO, diff --git a/os/os-linux.h b/os/os-linux.h index 23c16b6..b36d33c 100644 --- a/os/os-linux.h +++ b/os/os-linux.h @@ -38,6 +38,7 @@ #define FIO_HAVE_BINJECT #define FIO_HAVE_GETTID #define FIO_USE_GENERIC_INIT_RANDOM_STATE +#define FIO_HAVE_PWRITEV2 #ifdef MAP_HUGETLB #define FIO_HAVE_MMAP_HUGE @@ -289,4 +290,55 @@ static inline int fio_set_sched_idle(void) #define FIO_HAVE_STREAMID +#ifndef RWF_HIPRI +#define RWF_HIPRI 0x00000001 +#endif +#ifndef RWF_DSYNC +#define RWF_DSYNC 0x00000002 +#endif +#ifndef RWF_SYNC +#define RWF_SYNC 0x00000004 +#endif + +#ifndef CONFIG_PWRITEV2 +#ifdef __NR_preadv2 +static inline void make_pos_h_l(unsigned long *pos_h, unsigned long *pos_l, + off_t offset) +{ + *pos_l = offset & 0xffffffff; + *pos_h = ((uint64_t) offset) >> 32; + +} +static inline ssize_t preadv2(int fd, const struct iovec *iov, int iovcnt, + off_t offset, unsigned int flags) +{ + unsigned long pos_l, pos_h; + + make_pos_h_l(&pos_h, &pos_l, offset); + return syscall(__NR_preadv2, fd, iov, iovcnt, pos_l, pos_h, flags); +} +static inline ssize_t pwritev2(int fd, const struct iovec *iov, int iovcnt, + off_t offset, unsigned int flags) +{ + unsigned long pos_l, pos_h; + + make_pos_h_l(&pos_h, &pos_l, offset); + return syscall(__NR_pwritev2, fd, iov, iovcnt, pos_l, pos_h, flags); +} +#else +static inline ssize_t preadv2(int fd, const struct iovec *iov, int iovcnt, + off_t offset, unsigned int flags) +{ + errno = ENOSYS; + return -1; +} +static inline ssize_t pwritev2(int fd, const struct iovec *iov, int iovcnt, + off_t offset, unsigned int flags) +{ + errno = ENOSYS; + return -1; +} +#endif /* __NR_preadv2 */ +#endif /* CONFIG_PWRITEV2 */ + #endif -- To unsubscribe from this list: send the line "unsubscribe fio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html