Enable preadv2/pwritev2 engines by default on Linux
authorJens Axboe <axboe@fb.com>
Thu, 2 Jun 2016 16:54:24 +0000 (10:54 -0600)
committerJens Axboe <axboe@fb.com>
Thu, 2 Jun 2016 16:54:24 +0000 (10:54 -0600)
We don't have defines in libc yet, but let's wire them up so we
can use them. Only enabled for x86 and x86-64, adding for other
architectures would be as simple as adding the right defines
for the two syscall numbers.

Signed-off-by: Jens Axboe <axboe@fb.com>
arch/arch-x86.h
arch/arch-x86_64.h
engines/sync.c
options.c
os/os-linux.h

index 385a912..9471a89 100644 (file)
@@ -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")
index 8f33fc5..21da412 100644 (file)
@@ -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")
index 260ef66..433e4fa 100644 (file)
@@ -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
 }
index 3360784..1b6ce25 100644 (file)
--- 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",
                          },
index 23c16b6..b36d33c 100644 (file)
@@ -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