os-linux.h revision 22f78b320a8d2ffa32b5736fe754c108a8d21525
1ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#ifndef FIO_OS_LINUX_H
2ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define FIO_OS_LINUX_H
3ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
4ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#include <sys/ioctl.h>
58756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe#include <sys/uio.h>
63c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe#include <sys/syscall.h>
73c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe#include <unistd.h>
88756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe#include <asm/unistd.h>
9ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
10ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define FIO_HAVE_LIBAIO
11ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define FIO_HAVE_POSIXAIO
12ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define FIO_HAVE_FADVISE
13ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define FIO_HAVE_CPU_AFFINITY
14ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define FIO_HAVE_DISK_UTIL
15ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define FIO_HAVE_SGIO
16ba4f8923a7d7b02e69f6daee8dee5ed6e44722ceJens Axboe#define FIO_HAVE_IOPRIO
178756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe#define FIO_HAVE_SPLICE
1822f78b320a8d2ffa32b5736fe754c108a8d21525Jens Axboe#define FIO_HAVE_IOSCHED_SWITCH
19ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
20ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define OS_MAP_ANON		(MAP_ANONYMOUS)
21ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
22ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboetypedef cpu_set_t os_cpu_mask_t;
23ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
24ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe/*
25ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * we want fadvise64 really, but it's so tangled... later
26ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe */
27ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define fadvise(fd, off, len, advice)	\
28ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	posix_fadvise((fd), (off_t)(off), (len), (advice))
29ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
30ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define fio_setaffinity(td)		\
31ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	sched_setaffinity((td)->pid, sizeof((td)->cpumask), &(td)->cpumask)
32ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define fio_getaffinity(pid, ptr)	\
33ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	sched_getaffinity((pid), sizeof(cpu_set_t), (ptr))
34ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
35ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboestatic inline int ioprio_set(int which, int who, int ioprio)
36ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
37ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	return syscall(__NR_ioprio_set, which, who, ioprio);
38ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
39ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
408756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboestatic _syscall6(int, sys_splice, int, fdin, loff_t *, off_in, int, fdout, loff_t *, off_out, size_t, len, unsigned int, flags);
418756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboestatic _syscall4(int, sys_vmsplice, int, fd, const struct iovec *, iov, unsigned long, nr_segs, unsigned int, flags);
428756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboestatic _syscall4(int, sys_tee, int, fdin, int, fdout, size_t, len, unsigned int, flags);
438756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe
448756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboestatic inline int splice(int fdin, loff_t *off_in, int fdout, loff_t *off_out,
458756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe			 size_t len, unsigned long flags)
468756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe{
478756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe	return sys_splice(fdin, off_in, fdout, off_out, len, flags);
488756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe}
498756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe
508756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboestatic inline int tee(int fdin, int fdout, size_t len, unsigned int flags)
518756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe{
528756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe	return sys_tee(fdin, fdout, len, flags);
538756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe}
548756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe
558756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboestatic inline int vmsplice(int fd, const struct iovec *iov,
568756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe			   unsigned long nr_segs, unsigned int flags)
578756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe{
588756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe	return sys_vmsplice(fd, iov, nr_segs, flags);
598756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe}
608756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe
618756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe#define SPLICE_F_MOVE	(0x01)	/* move pages instead of copying */
628756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe#define SPLICE_F_NONBLOCK (0x02) /* don't block on the pipe splicing (but */
638756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe				 /* we may still block on the fd we splice */
648756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe				 /* from/to, of course */
658756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe#define SPLICE_F_MORE	(0x04)	/* expect more data */
668756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe#define SPLICE_F_GIFT   (0x08)  /* pages passed in are a gift */
678756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe
683feedc608f168479bde2f2e079cedd6852cb3b3bJens Axboe#define SPLICE_DEF_SIZE	(64*1024)
693feedc608f168479bde2f2e079cedd6852cb3b3bJens Axboe
70ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboeenum {
71ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	IOPRIO_WHO_PROCESS = 1,
72ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	IOPRIO_WHO_PGRP,
73ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	IOPRIO_WHO_USER,
74ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe};
75ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
76ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define IOPRIO_CLASS_SHIFT	13
77ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
78ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#ifndef BLKGETSIZE64
79ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define BLKGETSIZE64	_IOR(0x12,114,size_t)
80ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#endif
81ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
829104f874d726e84739d3b4008eee0f6ddfe96714Jens Axboestatic inline int blockdev_size(int fd, unsigned long long *bytes)
83ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
84ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (!ioctl(fd, BLKGETSIZE64, bytes))
85ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 0;
86ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
87ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	return errno;
88ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
89ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
90ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#endif
91