From: Jens Axboe Date: Thu, 2 Jun 2016 16:54:24 +0000 (-0600) Subject: Enable preadv2/pwritev2 engines by default on Linux X-Git-Tag: fio-2.12~16 X-Git-Url: https://git.kernel.dk/?p=fio.git;a=commitdiff_plain;h=6562685f373b9bc5f1ed909281737f55b34934a4;ds=sidebyside Enable preadv2/pwritev2 engines by default on Linux 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 --- diff --git a/arch/arch-x86.h b/arch/arch-x86.h index 385a9124..9471a891 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 8f33fc54..21da4125 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 260ef664..433e4fa2 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/options.c b/options.c index 3360784a..1b6ce25c 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", }, diff --git a/os/os-linux.h b/os/os-linux.h index 23c16b65..b36d33c9 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