os-linux.h revision d09913c248f04ab33a7e7bbfb2227e9db8b9f4a2
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>
897fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe#include <fcntl.h>
93c2d93ede7d03b3a6923edb55c7737fe014794cbJens Axboe#include <errno.h>
10d09913c248f04ab33a7e7bbfb2227e9db8b9f4a2Jens Axboe#include <sched.h>
11ea421790658582e392c5bb562ff461f8f5c71844Jens Axboe#include <linux/unistd.h>
1207e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe#include <linux/raw.h>
1307e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe#include <linux/major.h>
14ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
15f3de88a7a8806016ebb27af3f4be1fced172122eJens Axboe#include "indirect.h"
16f3de88a7a8806016ebb27af3f4be1fced172122eJens Axboe
17ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define FIO_HAVE_LIBAIO
18ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define FIO_HAVE_POSIXAIO
19ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define FIO_HAVE_FADVISE
20ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define FIO_HAVE_CPU_AFFINITY
21ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define FIO_HAVE_DISK_UTIL
22ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define FIO_HAVE_SGIO
23ba4f8923a7d7b02e69f6daee8dee5ed6e44722ceJens Axboe#define FIO_HAVE_IOPRIO
248756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe#define FIO_HAVE_SPLICE
2522f78b320a8d2ffa32b5736fe754c108a8d21525Jens Axboe#define FIO_HAVE_IOSCHED_SWITCH
262c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboe#define FIO_HAVE_ODIRECT
2774b025b071b5bfbffa7ad7682b66b749e8d1f955Jens Axboe#define FIO_HAVE_HUGETLB
2807e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe#define FIO_HAVE_RAWBIND
295e62c22a669c7a8c03b7871852cf85ad6d355980Jens Axboe#define FIO_HAVE_BLKTRACE
305921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe#define FIO_HAVE_STRSEP
31fffca02dfd1b700903ba23b67fab7b59bf460ec2Jens Axboe#define FIO_HAVE_FALLOCATE
32207cb0f05e689a50ffb960830f52169a1342aba7Jens Axboe#define FIO_HAVE_POSIXAIO_FSYNC
33f356d01d0cf8fec2ee58f66a9b5c00c93defbc47Jens Axboe#define FIO_HAVE_PSHARED_MUTEX
34eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe#define FIO_HAVE_CL_SIZE
35a696fa2a9c2e21a1c88813235d6fc39d267f6155Jens Axboe#define FIO_HAVE_CGROUPS
36b6959b55efa7f464dbb7e7f2021dd67d297219bdJens Axboe
37dc873b6f4a536c332b72cce268d5a7ccd356a891Jens Axboe#define OS_MAP_ANON		MAP_ANONYMOUS
38ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
394d8947de2b50578a4f6290be567cb5de5bf46776Shawn Lewis#ifndef CLOCK_MONOTONIC
404d8947de2b50578a4f6290be567cb5de5bf46776Shawn Lewis#define CLOCK_MONOTONIC 1
414d8947de2b50578a4f6290be567cb5de5bf46776Shawn Lewis#endif
424d8947de2b50578a4f6290be567cb5de5bf46776Shawn Lewis
43ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboetypedef cpu_set_t os_cpu_mask_t;
444e78e405a12b31291aa88fffc1da2cf43b782ef5Jens Axboe
456dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboetypedef struct drand48_data os_random_state_t;
46ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
47ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe/*
48ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe * we want fadvise64 really, but it's so tangled... later
49ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe */
504d8947de2b50578a4f6290be567cb5de5bf46776Shawn Lewis#ifdef FIO_HAVE_FADVISE
51ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define fadvise(fd, off, len, advice)	\
52ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	posix_fadvise((fd), (off_t)(off), (len), (advice))
534d8947de2b50578a4f6290be567cb5de5bf46776Shawn Lewis#endif
54ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
55c8f025f8a33e05b10fe928d5899ac4e948847eb6Jens Axboe/*
56c8f025f8a33e05b10fe928d5899ac4e948847eb6Jens Axboe * If you are on an ancient glibc (2.3.2), then define GLIBC_2_3_2 if you want
57c8f025f8a33e05b10fe928d5899ac4e948847eb6Jens Axboe * the affinity helpers to work.
58c8f025f8a33e05b10fe928d5899ac4e948847eb6Jens Axboe */
59c8f025f8a33e05b10fe928d5899ac4e948847eb6Jens Axboe#ifndef GLIBC_2_3_2
60e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe#define fio_setaffinity(pid, cpumask)		\
61e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	sched_setaffinity((pid), sizeof(cpumask), &(cpumask))
62ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define fio_getaffinity(pid, ptr)	\
63ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	sched_getaffinity((pid), sizeof(cpu_set_t), (ptr))
64c8f025f8a33e05b10fe928d5899ac4e948847eb6Jens Axboe#else
65e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe#define fio_setaffinity(pid, cpumask)	\
66e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe	sched_setaffinity((pid), &(cpumask))
67c8f025f8a33e05b10fe928d5899ac4e948847eb6Jens Axboe#define fio_getaffinity(pid, ptr)	\
68c8f025f8a33e05b10fe928d5899ac4e948847eb6Jens Axboe	sched_getaffinity((pid), (ptr))
69c8f025f8a33e05b10fe928d5899ac4e948847eb6Jens Axboe#endif
70be4ecfdf6c8daa75c4df8ac875c9a87da80d81a0Jens Axboe
71be4ecfdf6c8daa75c4df8ac875c9a87da80d81a0Jens Axboe#define fio_cpu_clear(mask, cpu)	CPU_CLR((cpu), (mask))
726d459ee7e90393af490a64709aec206d8a585ebdJens Axboe#define fio_cpu_set(mask, cpu)		CPU_SET((cpu), (mask))
73d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboe
74d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboestatic inline int fio_cpuset_init(os_cpu_mask_t *mask)
75d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboe{
76d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboe	CPU_ZERO(mask);
77d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboe	return 0;
78d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboe}
79d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboe
80d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboestatic inline int fio_cpuset_exit(os_cpu_mask_t *mask)
81d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboe{
82d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboe	return 0;
83d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboe}
846d459ee7e90393af490a64709aec206d8a585ebdJens Axboe
856d459ee7e90393af490a64709aec206d8a585ebdJens Axboe#define FIO_MAX_CPUS			CPU_SETSIZE
864d8947de2b50578a4f6290be567cb5de5bf46776Shawn Lewis
87ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboestatic inline int ioprio_set(int which, int who, int ioprio)
88ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
89ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	return syscall(__NR_ioprio_set, which, who, ioprio);
90ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
91ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
9297fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe/*
9397fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe * Just check for SPLICE_F_MOVE, if that isn't there, assume the others
9497fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe * aren't either.
9597fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe */
9697fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe#ifndef SPLICE_F_MOVE
9797fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe#define SPLICE_F_MOVE	(0x01)	/* move pages instead of copying */
9897fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe#define SPLICE_F_NONBLOCK (0x02) /* don't block on the pipe splicing (but */
9997fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe				 /* we may still block on the fd we splice */
10097fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe				 /* from/to, of course */
10197fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe#define SPLICE_F_MORE	(0x04)	/* expect more data */
10297fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe#define SPLICE_F_GIFT   (0x08)  /* pages passed in are a gift */
1038756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe
1048756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboestatic inline int splice(int fdin, loff_t *off_in, int fdout, loff_t *off_out,
105495ee9b632c5629e79a46d1074cacf4eda965e13Jens Axboe			 size_t len, unsigned int flags)
1068756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe{
10797fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe	return syscall(__NR_sys_splice, fdin, off_in, fdout, off_out, len, flags);
1088756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe}
1098756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe
1108756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboestatic inline int tee(int fdin, int fdout, size_t len, unsigned int flags)
1118756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe{
11297fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe	return syscall(__NR_sys_tee, fdin, fdout, len, flags);
1138756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe}
1148756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe
1158756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboestatic inline int vmsplice(int fd, const struct iovec *iov,
1168756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe			   unsigned long nr_segs, unsigned int flags)
1178756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe{
11897fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe	return syscall(__NR_sys_vmsplice, fd, iov, nr_segs, flags);
1198756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe}
12097fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe#endif
1218756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe
1223feedc608f168479bde2f2e079cedd6852cb3b3bJens Axboe#define SPLICE_DEF_SIZE	(64*1024)
1233feedc608f168479bde2f2e079cedd6852cb3b3bJens Axboe
124b6959b55efa7f464dbb7e7f2021dd67d297219bdJens Axboe#ifdef FIO_HAVE_SYSLET
125bf0dc8fae8b21c666a0a927c1d473ad59101e7fdIngo Molnar
126bf0dc8fae8b21c666a0a927c1d473ad59101e7fdIngo Molnarstruct syslet_uatom;
127bf0dc8fae8b21c666a0a927c1d473ad59101e7fdIngo Molnarstruct async_head_user;
128bf0dc8fae8b21c666a0a927c1d473ad59101e7fdIngo Molnar
129a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe/*
130a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe * syslet stuff
131a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe */
132bf0dc8fae8b21c666a0a927c1d473ad59101e7fdIngo Molnarstatic inline struct syslet_uatom *
133bf0dc8fae8b21c666a0a927c1d473ad59101e7fdIngo Molnarasync_exec(struct syslet_uatom *atom, struct async_head_user *ahu)
134a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe{
1352b52511f3f595e0932e7f9c55bed243e8fe0f4f8Daniel Rall	return (struct syslet_uatom *) syscall(__NR_async_exec, atom, ahu);
136a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe}
137a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe
138bf0dc8fae8b21c666a0a927c1d473ad59101e7fdIngo Molnarstatic inline long
139bf0dc8fae8b21c666a0a927c1d473ad59101e7fdIngo Molnarasync_wait(unsigned long min_wait_events, unsigned long user_ring_idx,
140bf0dc8fae8b21c666a0a927c1d473ad59101e7fdIngo Molnar	   struct async_head_user *ahu)
141a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe{
142bf0dc8fae8b21c666a0a927c1d473ad59101e7fdIngo Molnar	return syscall(__NR_async_wait, min_wait_events,
143bf0dc8fae8b21c666a0a927c1d473ad59101e7fdIngo Molnar			user_ring_idx, ahu);
144a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe}
145a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe
1467756b0d046ef74c32df134c8b716237cc5e16badJens Axboestatic inline long async_thread(void *event, struct async_head_user *ahu)
147a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe{
1487756b0d046ef74c32df134c8b716237cc5e16badJens Axboe	return syscall(__NR_async_thread, event, ahu);
149a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe}
150a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe
151a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboestatic inline long umem_add(unsigned long *uptr, unsigned long inc)
152a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe{
153a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe	return syscall(__NR_umem_add, uptr, inc);
154a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe}
155b6959b55efa7f464dbb7e7f2021dd67d297219bdJens Axboe#endif /* FIO_HAVE_SYSLET */
156a4f4fdd7c9e46a50bc33ecef44d9f06036580ad4Jens Axboe
157ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboeenum {
1586cefbe338b159edc9417da5840383765acbd92c7Jens Axboe	IOPRIO_CLASS_NONE,
1596cefbe338b159edc9417da5840383765acbd92c7Jens Axboe	IOPRIO_CLASS_RT,
1606cefbe338b159edc9417da5840383765acbd92c7Jens Axboe	IOPRIO_CLASS_BE,
1616cefbe338b159edc9417da5840383765acbd92c7Jens Axboe	IOPRIO_CLASS_IDLE,
1626cefbe338b159edc9417da5840383765acbd92c7Jens Axboe};
1636cefbe338b159edc9417da5840383765acbd92c7Jens Axboe
1646cefbe338b159edc9417da5840383765acbd92c7Jens Axboeenum {
165ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	IOPRIO_WHO_PROCESS = 1,
166ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	IOPRIO_WHO_PGRP,
167ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	IOPRIO_WHO_USER,
168ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe};
169ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
1706cefbe338b159edc9417da5840383765acbd92c7Jens Axboe#define IOPRIO_BITS		16
171ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define IOPRIO_CLASS_SHIFT	13
172ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
173ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#ifndef BLKGETSIZE64
174ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define BLKGETSIZE64	_IOR(0x12,114,size_t)
175ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#endif
176ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
177e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe#ifndef BLKFLSBUF
178e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe#define BLKFLSBUF	_IO(0x12,97)
179e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe#endif
180e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
181e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboestatic inline int blockdev_invalidate_cache(int fd)
182e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{
183a16211bb932067978f74606eb5d3f92e5227eee2Jens Axboe	return ioctl(fd, BLKFLSBUF);
184e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe}
185e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe
1869104f874d726e84739d3b4008eee0f6ddfe96714Jens Axboestatic inline int blockdev_size(int fd, unsigned long long *bytes)
187ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{
188ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	if (!ioctl(fd, BLKGETSIZE64, bytes))
189ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe		return 0;
190ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
191ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe	return errno;
192ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe}
193ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe
19432cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboestatic inline unsigned long long os_phys_mem(void)
19532cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe{
19632cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe	long pagesize, pages;
19732cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe
19832cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe	pagesize = sysconf(_SC_PAGESIZE);
19932cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe	pages = sysconf(_SC_PHYS_PAGES);
20032cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe	if (pages == -1 || pagesize == -1)
20132cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe		return 0;
20232cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe
20332cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe	return (unsigned long long) pages * (unsigned long long) pagesize;
20432cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe}
20532cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe
2066dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboestatic inline void os_random_seed(unsigned long seed, os_random_state_t *rs)
2076dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe{
2086dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe	srand48_r(seed, rs);
2096dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe}
2106dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe
2116dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboestatic inline long os_random_long(os_random_state_t *rs)
2126dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe{
2136dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe	long val;
2146dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe
2156dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe	lrand48_r(rs, &val);
2166dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe	return val;
2176dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe}
2186dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe
2198cc7afa91ddc5a0980b9d2dbfdd66e1511a0d4b1Jens Axboestatic inline int fio_lookup_raw(dev_t dev, int *majdev, int *mindev)
22007e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe{
22107e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	struct raw_config_request rq;
22207e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	int fd;
22307e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe
22407e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	if (major(dev) != RAW_MAJOR)
2258cc7afa91ddc5a0980b9d2dbfdd66e1511a0d4b1Jens Axboe		return 1;
22607e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe
22707e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	/*
22807e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	 * we should be able to find /dev/rawctl or /dev/raw/rawctl
22907e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	 */
23007e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	fd = open("/dev/rawctl", O_RDONLY);
23107e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	if (fd < 0) {
23207e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe		fd = open("/dev/raw/rawctl", O_RDONLY);
23307e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe		if (fd < 0)
2348cc7afa91ddc5a0980b9d2dbfdd66e1511a0d4b1Jens Axboe			return 1;
23507e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	}
23607e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe
23707e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	rq.raw_minor = minor(dev);
23807e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	if (ioctl(fd, RAW_GETBIND, &rq) < 0) {
23907e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe		close(fd);
2408cc7afa91ddc5a0980b9d2dbfdd66e1511a0d4b1Jens Axboe		return 1;
24107e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	}
24207e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe
24307e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	close(fd);
24407e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	*majdev = rq.block_major;
24507e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe	*mindev = rq.block_minor;
2468cc7afa91ddc5a0980b9d2dbfdd66e1511a0d4b1Jens Axboe	return 0;
24707e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe}
24807e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe
2495b6f5c6609c530943310754028d2628d984b6595Jens Axboe#ifdef O_NOATIME
2505921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe#define FIO_O_NOATIME	O_NOATIME
2515b6f5c6609c530943310754028d2628d984b6595Jens Axboe#else
2525b6f5c6609c530943310754028d2628d984b6595Jens Axboe#define FIO_O_NOATIME	0
2535b6f5c6609c530943310754028d2628d984b6595Jens Axboe#endif
2545921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe
255a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#ifdef MADV_REMOVE
256a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#define FIO_MADV_FREE	MADV_REMOVE
257a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#endif
258a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe
259eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe#define CACHE_LINE_FILE	\
260eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe	"/sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size"
261eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe
262eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboestatic inline int arch_cache_line_size(void)
263eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe{
264eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe	char size[32];
265eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe	int fd, ret;
266eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe
267eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe	fd = open(CACHE_LINE_FILE, O_RDONLY);
268eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe	if (fd < 0)
269eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe		return -1;
270eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe
271eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe	ret = read(fd, size, sizeof(size));
272ec76f15a4ae995c06db6c6dda6a6fa41b189f613Jens Axboe
273ec76f15a4ae995c06db6c6dda6a6fa41b189f613Jens Axboe	close(fd);
274ec76f15a4ae995c06db6c6dda6a6fa41b189f613Jens Axboe
275eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe	if (ret <= 0)
276eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe		return -1;
277ec76f15a4ae995c06db6c6dda6a6fa41b189f613Jens Axboe	else
278ec76f15a4ae995c06db6c6dda6a6fa41b189f613Jens Axboe		return atoi(size);
279eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe}
280eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe
281ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#endif
282