Commit | Line | Data |
---|---|---|
ebac4655 JA |
1 | #ifndef FIO_OS_H |
2 | #define FIO_OS_H | |
3 | ||
a14ca44a | 4 | #include <sys/types.h> |
203913ea | 5 | #include <sys/socket.h> |
93bcfd20 | 6 | #include <fcntl.h> |
03e20d68 | 7 | #include <pthread.h> |
a14ca44a | 8 | #include <unistd.h> |
ecc314ba | 9 | #include <stdlib.h> |
a14ca44a | 10 | |
cca84643 JA |
11 | enum { |
12 | os_linux = 1, | |
13 | os_aix, | |
14 | os_freebsd, | |
15 | os_hpux, | |
16 | os_mac, | |
17 | os_netbsd, | |
18 | os_solaris, | |
19 | os_windows, | |
ec5c6b12 | 20 | os_android, |
cca84643 JA |
21 | |
22 | os_nr, | |
23 | }; | |
24 | ||
ec5c6b12 AC |
25 | #if defined(__ANDROID__) |
26 | #include "os-android.h" | |
27 | #elif defined(__linux__) | |
ebac4655 JA |
28 | #include "os-linux.h" |
29 | #elif defined(__FreeBSD__) | |
30 | #include "os-freebsd.h" | |
7452440e YT |
31 | #elif defined(__NetBSD__) |
32 | #include "os-netbsd.h" | |
2c0ecd28 JA |
33 | #elif defined(__sun__) |
34 | #include "os-solaris.h" | |
2afd826b JA |
35 | #elif defined(__APPLE__) |
36 | #include "os-mac.h" | |
bf2e821a CC |
37 | #elif defined(_AIX) |
38 | #include "os-aix.h" | |
c00a2289 JA |
39 | #elif defined(__hpux) |
40 | #include "os-hpux.h" | |
93bcfd20 | 41 | #elif defined(WIN32) |
03e20d68 | 42 | #include "os-windows.h" |
ebac4655 JA |
43 | #else |
44 | #error "unsupported os" | |
45 | #endif | |
46 | ||
67bf9823 | 47 | #ifdef CONFIG_POSIXAIO |
ebac4655 | 48 | #include <aio.h> |
e97c1442 JA |
49 | #ifndef FIO_OS_HAVE_AIOCB_TYPEDEF |
50 | typedef struct aiocb os_aiocb_t; | |
51 | #endif | |
ebac4655 JA |
52 | #endif |
53 | ||
54 | #ifdef FIO_HAVE_SGIO | |
55 | #include <linux/fs.h> | |
56 | #include <scsi/sg.h> | |
57 | #endif | |
58 | ||
67bf9823 | 59 | #ifdef CONFIG_STRSEP |
00fb3c8d | 60 | #include "../lib/strsep.h" |
5921e80c JA |
61 | #endif |
62 | ||
8e239cae JA |
63 | #ifdef MSG_DONTWAIT |
64 | #define OS_MSG_DONTWAIT MSG_DONTWAIT | |
65 | #endif | |
66 | ||
4d8947de | 67 | #ifndef POSIX_FADV_DONTNEED |
ebac4655 JA |
68 | #define POSIX_FADV_DONTNEED (0) |
69 | #define POSIX_FADV_SEQUENTIAL (0) | |
70 | #define POSIX_FADV_RANDOM (0) | |
4d8947de | 71 | #endif |
ebac4655 JA |
72 | |
73 | #ifndef FIO_HAVE_CPU_AFFINITY | |
e8462bd8 | 74 | #define fio_setaffinity(pid, mask) (0) |
be4ecfdf JA |
75 | #define fio_getaffinity(pid, mask) do { } while (0) |
76 | #define fio_cpu_clear(mask, cpu) do { } while (0) | |
85daf2c1 | 77 | #define fio_cpuset_exit(mask) (-1) |
7452440e | 78 | typedef unsigned long os_cpu_mask_t; |
ebac4655 JA |
79 | #endif |
80 | ||
81 | #ifndef FIO_HAVE_IOPRIO | |
82 | #define ioprio_set(which, who, prio) (0) | |
83 | #endif | |
84 | ||
2c0ecd28 | 85 | #ifndef FIO_HAVE_ODIRECT |
7d424763 JA |
86 | #define OS_O_DIRECT 0 |
87 | #else | |
88 | #define OS_O_DIRECT O_DIRECT | |
2c0ecd28 JA |
89 | #endif |
90 | ||
74b025b0 JA |
91 | #ifndef FIO_HAVE_HUGETLB |
92 | #define SHM_HUGETLB 0 | |
d6dc02fb | 93 | #define MAP_HUGETLB 0 |
4d8947de | 94 | #ifndef FIO_HUGE_PAGE |
74b025b0 | 95 | #define FIO_HUGE_PAGE 0 |
4d8947de | 96 | #endif |
74b025b0 | 97 | #else |
cb25df61 | 98 | #ifndef FIO_HUGE_PAGE |
ee0e0a71 | 99 | #define FIO_HUGE_PAGE 4194304 |
74b025b0 | 100 | #endif |
cb25df61 | 101 | #endif |
74b025b0 | 102 | |
39b93568 JA |
103 | #ifndef FIO_HAVE_MMAP_HUGE |
104 | #define MAP_HUGETLB 0 | |
105 | #endif | |
106 | ||
5921e80c JA |
107 | #ifndef FIO_O_NOATIME |
108 | #define FIO_O_NOATIME 0 | |
109 | #endif | |
110 | ||
dc873b6f JA |
111 | #ifndef OS_RAND_MAX |
112 | #define OS_RAND_MAX RAND_MAX | |
113 | #endif | |
114 | ||
07e5b264 | 115 | #ifndef FIO_HAVE_RAWBIND |
8cc7afa9 | 116 | #define fio_lookup_raw(dev, majdev, mindev) 1 |
07e5b264 JA |
117 | #endif |
118 | ||
58483fa4 JA |
119 | #ifndef FIO_PREFERRED_ENGINE |
120 | #define FIO_PREFERRED_ENGINE "sync" | |
121 | #endif | |
122 | ||
b9fd788f BC |
123 | #ifndef FIO_OS_PATH_SEPARATOR |
124 | #define FIO_OS_PATH_SEPARATOR "/" | |
125 | #endif | |
126 | ||
16de1bf9 | 127 | #ifndef FIO_PREFERRED_CLOCK_SOURCE |
a7f5831f | 128 | #define FIO_PREFERRED_CLOCK_SOURCE CS_CGETTIME |
16de1bf9 BC |
129 | #endif |
130 | ||
fca70358 JA |
131 | #ifndef FIO_MAX_JOBS |
132 | #define FIO_MAX_JOBS 2048 | |
133 | #endif | |
134 | ||
67bf9823 JA |
135 | #ifndef CONFIG_SOCKLEN_T |
136 | typedef unsigned int socklen_t; | |
5ba13ea6 JA |
137 | #endif |
138 | ||
45054cbe | 139 | #ifndef FIO_OS_HAS_CTIME_R |
1f81991e | 140 | #define os_ctime_r(x, y, z) (void) ctime_r((x), (y)) |
45054cbe SD |
141 | #endif |
142 | ||
901ebe18 | 143 | #ifdef FIO_USE_GENERIC_SWAP |
9677bec3 | 144 | static inline uint16_t fio_swap16(uint16_t val) |
232f9b73 JA |
145 | { |
146 | return (val << 8) | (val >> 8); | |
147 | } | |
148 | ||
901ebe18 | 149 | static inline uint32_t fio_swap32(uint32_t val) |
232f9b73 JA |
150 | { |
151 | val = ((val & 0xff00ff00UL) >> 8) | ((val & 0x00ff00ffUL) << 8); | |
152 | ||
153 | return (val >> 16) | (val << 16); | |
154 | } | |
155 | ||
901ebe18 | 156 | static inline uint64_t fio_swap64(uint64_t val) |
232f9b73 JA |
157 | { |
158 | val = ((val & 0xff00ff00ff00ff00ULL) >> 8) | | |
159 | ((val & 0x00ff00ff00ff00ffULL) << 8); | |
160 | val = ((val & 0xffff0000ffff0000ULL) >> 16) | | |
161 | ((val & 0x0000ffff0000ffffULL) << 16); | |
162 | ||
163 | return (val >> 32) | (val << 32); | |
164 | } | |
165 | #endif | |
166 | ||
ec5c6b12 | 167 | #ifndef FIO_HAVE_BYTEORDER_FUNCS |
0dcebdf4 | 168 | #ifdef CONFIG_LITTLE_ENDIAN |
8111092f JA |
169 | #define __le16_to_cpu(x) (x) |
170 | #define __le32_to_cpu(x) (x) | |
171 | #define __le64_to_cpu(x) (x) | |
172 | #define __cpu_to_le16(x) (x) | |
173 | #define __cpu_to_le32(x) (x) | |
174 | #define __cpu_to_le64(x) (x) | |
175 | #else | |
176 | #define __le16_to_cpu(x) fio_swap16(x) | |
177 | #define __le32_to_cpu(x) fio_swap32(x) | |
178 | #define __le64_to_cpu(x) fio_swap64(x) | |
179 | #define __cpu_to_le16(x) fio_swap16(x) | |
180 | #define __cpu_to_le32(x) fio_swap32(x) | |
181 | #define __cpu_to_le64(x) fio_swap64(x) | |
182 | #endif | |
ec5c6b12 | 183 | #endif /* FIO_HAVE_BYTEORDER_FUNCS */ |
8111092f JA |
184 | |
185 | #define le16_to_cpu(val) ({ \ | |
186 | uint16_t *__val = &(val); \ | |
187 | __le16_to_cpu(*__val); \ | |
188 | }) | |
189 | #define le32_to_cpu(val) ({ \ | |
190 | uint32_t *__val = &(val); \ | |
191 | __le32_to_cpu(*__val); \ | |
192 | }) | |
193 | #define le64_to_cpu(val) ({ \ | |
194 | uint64_t *__val = &(val); \ | |
195 | __le64_to_cpu(*__val); \ | |
196 | }) | |
197 | #define cpu_to_le16(val) ({ \ | |
198 | uint16_t *__val = &(val); \ | |
199 | __cpu_to_le16(*__val); \ | |
200 | }) | |
201 | #define cpu_to_le32(val) ({ \ | |
202 | uint32_t *__val = &(val); \ | |
203 | __cpu_to_le32(*__val); \ | |
204 | }) | |
205 | #define cpu_to_le64(val) ({ \ | |
206 | uint64_t *__val = &(val); \ | |
207 | __cpu_to_le64(*__val); \ | |
208 | }) | |
209 | ||
5e62c22a JA |
210 | #ifndef FIO_HAVE_BLKTRACE |
211 | static inline int is_blktrace(const char *fname) | |
212 | { | |
213 | return 0; | |
214 | } | |
5921e80c | 215 | struct thread_data; |
5e62c22a JA |
216 | static inline int load_blktrace(struct thread_data *td, const char *fname) |
217 | { | |
218 | return 1; | |
219 | } | |
220 | #endif | |
221 | ||
eb7ccf38 JA |
222 | #define FIO_DEF_CL_SIZE 128 |
223 | ||
224 | static inline int os_cache_line_size(void) | |
225 | { | |
226 | #ifdef FIO_HAVE_CL_SIZE | |
227 | int ret = arch_cache_line_size(); | |
228 | ||
229 | if (ret <= 0) | |
230 | return FIO_DEF_CL_SIZE; | |
231 | ||
232 | return ret; | |
233 | #else | |
234 | return FIO_DEF_CL_SIZE; | |
235 | #endif | |
236 | } | |
237 | ||
792d5517 | 238 | #ifdef FIO_USE_GENERIC_BDEV_SIZE |
ecc314ba | 239 | static inline int blockdev_size(struct fio_file *f, unsigned long long *bytes) |
792d5517 | 240 | { |
3b2e1464 | 241 | off_t end; |
792d5517 | 242 | |
3b2e1464 JA |
243 | *bytes = 0; |
244 | ||
ecc314ba | 245 | end = lseek(f->fd, 0, SEEK_END); |
792d5517 JA |
246 | if (end < 0) |
247 | return errno; | |
248 | ||
249 | *bytes = end; | |
250 | return 0; | |
251 | } | |
252 | #endif | |
253 | ||
53531370 JA |
254 | #ifdef FIO_USE_GENERIC_RAND |
255 | typedef unsigned int os_random_state_t; | |
256 | ||
257 | static inline void os_random_seed(unsigned long seed, os_random_state_t *rs) | |
258 | { | |
259 | srand(seed); | |
260 | } | |
261 | ||
262 | static inline long os_random_long(os_random_state_t *rs) | |
263 | { | |
264 | long val; | |
265 | ||
266 | val = rand_r(rs); | |
267 | return val; | |
268 | } | |
269 | #endif | |
270 | ||
93bcfd20 BC |
271 | #ifdef FIO_USE_GENERIC_INIT_RANDOM_STATE |
272 | extern void td_fill_rand_seeds(struct thread_data *td); | |
273 | /* | |
274 | * Initialize the various random states we need (random io, block size ranges, | |
275 | * read/write mix, etc). | |
276 | */ | |
277 | static inline int init_random_state(struct thread_data *td, unsigned long *rand_seeds, int size) | |
278 | { | |
279 | int fd; | |
280 | ||
281 | fd = open("/dev/urandom", O_RDONLY); | |
282 | if (fd == -1) { | |
283 | return 1; | |
284 | } | |
285 | ||
286 | if (read(fd, rand_seeds, size) < size) { | |
287 | close(fd); | |
288 | return 1; | |
289 | } | |
290 | ||
291 | close(fd); | |
292 | td_fill_rand_seeds(td); | |
293 | return 0; | |
294 | } | |
295 | #endif | |
296 | ||
2e3bd4c2 JA |
297 | #ifndef FIO_HAVE_FS_STAT |
298 | static inline unsigned long long get_fs_size(const char *path) | |
299 | { | |
300 | return 0; | |
301 | } | |
302 | #endif | |
303 | ||
c00a2289 JA |
304 | #ifndef FIO_HAVE_CPU_ONLINE_SYSCONF |
305 | static inline unsigned int cpus_online(void) | |
306 | { | |
307 | return sysconf(_SC_NPROCESSORS_ONLN); | |
308 | } | |
309 | #endif | |
310 | ||
47f767c1 JA |
311 | #ifndef FIO_HAVE_GETTID |
312 | static inline int gettid(void) | |
313 | { | |
314 | return getpid(); | |
315 | } | |
316 | #endif | |
317 | ||
ebac4655 | 318 | #endif |