X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=os-linux.h;h=1f6a68dac2f1b0f0fa7890dab05a890f80265291;hp=0b1fc00a1ced92ba7c0a5d5f2cd16c76899bbd7e;hb=3feedc608f168479bde2f2e079cedd6852cb3b3b;hpb=ebac4655dd3624f3296ff83be48e0cdc02852f18 diff --git a/os-linux.h b/os-linux.h index 0b1fc00a..1f6a68da 100644 --- a/os-linux.h +++ b/os-linux.h @@ -2,6 +2,8 @@ #define FIO_OS_LINUX_H #include +#include +#include #define FIO_HAVE_LIBAIO #define FIO_HAVE_POSIXAIO @@ -9,6 +11,8 @@ #define FIO_HAVE_CPU_AFFINITY #define FIO_HAVE_DISK_UTIL #define FIO_HAVE_SGIO +#define FIO_HAVE_IOPRIO +#define FIO_HAVE_SPLICE #define OS_MAP_ANON (MAP_ANONYMOUS) @@ -30,6 +34,36 @@ static inline int ioprio_set(int which, int who, int ioprio) return syscall(__NR_ioprio_set, which, who, ioprio); } +static _syscall6(int, sys_splice, int, fdin, loff_t *, off_in, int, fdout, loff_t *, off_out, size_t, len, unsigned int, flags); +static _syscall4(int, sys_vmsplice, int, fd, const struct iovec *, iov, unsigned long, nr_segs, unsigned int, flags); +static _syscall4(int, sys_tee, int, fdin, int, fdout, size_t, len, unsigned int, flags); + +static inline int splice(int fdin, loff_t *off_in, int fdout, loff_t *off_out, + size_t len, unsigned long flags) +{ + return sys_splice(fdin, off_in, fdout, off_out, len, flags); +} + +static inline int tee(int fdin, int fdout, size_t len, unsigned int flags) +{ + return sys_tee(fdin, fdout, len, flags); +} + +static inline int vmsplice(int fd, const struct iovec *iov, + unsigned long nr_segs, unsigned int flags) +{ + return sys_vmsplice(fd, iov, nr_segs, flags); +} + +#define SPLICE_F_MOVE (0x01) /* move pages instead of copying */ +#define SPLICE_F_NONBLOCK (0x02) /* don't block on the pipe splicing (but */ + /* we may still block on the fd we splice */ + /* from/to, of course */ +#define SPLICE_F_MORE (0x04) /* expect more data */ +#define SPLICE_F_GIFT (0x08) /* pages passed in are a gift */ + +#define SPLICE_DEF_SIZE (64*1024) + enum { IOPRIO_WHO_PROCESS = 1, IOPRIO_WHO_PGRP, @@ -42,7 +76,7 @@ enum { #define BLKGETSIZE64 _IOR(0x12,114,size_t) #endif -static inline int blockdev_size(int fd, size_t *bytes) +static inline int blockdev_size(int fd, unsigned long long *bytes) { if (!ioctl(fd, BLKGETSIZE64, bytes)) return 0;