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