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 #include "../arch/arch.h" 12 #include "../lib/types.h" 13 14 enum { 15 os_linux = 1, 16 os_aix, 17 os_freebsd, 18 os_hpux, 19 os_mac, 20 os_netbsd, 21 os_openbsd, 22 os_solaris, 23 os_windows, 24 os_android, 25 os_dragonfly, 26 27 os_nr, 28 }; 29 30 #if defined(__ANDROID__) 31 #include "os-android.h" 32 #elif defined(__linux__) 33 #include "os-linux.h" 34 #elif defined(__FreeBSD__) 35 #include "os-freebsd.h" 36 #elif defined(__OpenBSD__) 37 #include "os-openbsd.h" 38 #elif defined(__NetBSD__) 39 #include "os-netbsd.h" 40 #elif defined(__sun__) 41 #include "os-solaris.h" 42 #elif defined(__APPLE__) 43 #include "os-mac.h" 44 #elif defined(_AIX) 45 #include "os-aix.h" 46 #elif defined(__hpux) 47 #include "os-hpux.h" 48 #elif defined(WIN32) 49 #include "os-windows.h" 50 #elif defined (__DragonFly__) 51 #include "os-dragonfly.h" 52 #else 53 #error "unsupported os" 54 #endif 55 56 #ifdef CONFIG_POSIXAIO 57 #include <aio.h> 58 #ifndef FIO_OS_HAVE_AIOCB_TYPEDEF 59 typedef struct aiocb os_aiocb_t; 60 #endif 61 #endif 62 63 #ifdef FIO_HAVE_SGIO 64 #include <linux/fs.h> 65 #include <scsi/sg.h> 66 #endif 67 68 #ifndef CONFIG_STRSEP 69 #include "../oslib/strsep.h" 70 #endif 71 72 #ifndef CONFIG_STRLCAT 73 #include "../oslib/strlcat.h" 74 #endif 75 76 #ifdef MSG_DONTWAIT 77 #define OS_MSG_DONTWAIT MSG_DONTWAIT 78 #endif 79 80 #ifndef POSIX_FADV_DONTNEED 81 #define POSIX_FADV_DONTNEED (0) 82 #define POSIX_FADV_SEQUENTIAL (0) 83 #define POSIX_FADV_RANDOM (0) 84 #define POSIX_FADV_NORMAL (0) 85 #endif 86 87 #ifndef FIO_HAVE_CPU_AFFINITY 88 #define fio_cpu_clear(mask, cpu) do { } while (0) 89 typedef unsigned long os_cpu_mask_t; 90 91 static inline int fio_setaffinity(int pid, os_cpu_mask_t cpumask) 92 { 93 return 0; 94 } 95 96 static inline int fio_getaffinity(int pid, os_cpu_mask_t *cpumask) 97 { 98 return -1; 99 } 100 101 static inline int fio_cpuset_exit(os_cpu_mask_t *mask) 102 { 103 return -1; 104 } 105 106 static inline int fio_cpus_split(os_cpu_mask_t *mask, unsigned int cpu_index) 107 { 108 return 0; 109 } 110 #else 111 extern int fio_cpus_split(os_cpu_mask_t *mask, unsigned int cpu); 112 #endif 113 114 #ifndef FIO_HAVE_IOPRIO 115 #define ioprio_set(which, who, prioclass, prio) (0) 116 #endif 117 118 #ifndef FIO_HAVE_ODIRECT 119 #define OS_O_DIRECT 0 120 #else 121 #define OS_O_DIRECT O_DIRECT 122 #endif 123 124 #ifdef OS_O_ATOMIC 125 #define FIO_O_ATOMIC OS_O_ATOMIC 126 #else 127 #define FIO_O_ATOMIC 0 128 #endif 129 130 #ifndef FIO_HAVE_HUGETLB 131 #define SHM_HUGETLB 0 132 #define MAP_HUGETLB 0 133 #ifndef FIO_HUGE_PAGE 134 #define FIO_HUGE_PAGE 0 135 #endif 136 #else 137 #ifndef FIO_HUGE_PAGE 138 #define FIO_HUGE_PAGE 4194304 139 #endif 140 #endif 141 142 #ifndef FIO_HAVE_MMAP_HUGE 143 #define MAP_HUGETLB 0 144 #endif 145 146 #ifndef FIO_O_NOATIME 147 #define FIO_O_NOATIME 0 148 #endif 149 150 #ifndef OS_RAND_MAX 151 #define OS_RAND_MAX RAND_MAX 152 #endif 153 154 #ifndef FIO_HAVE_RAWBIND 155 #define fio_lookup_raw(dev, majdev, mindev) 1 156 #endif 157 158 #ifndef FIO_PREFERRED_ENGINE 159 #define FIO_PREFERRED_ENGINE "psync" 160 #endif 161 162 #ifndef FIO_OS_PATH_SEPARATOR 163 #define FIO_OS_PATH_SEPARATOR "/" 164 #endif 165 166 #ifndef FIO_PREFERRED_CLOCK_SOURCE 167 #ifdef CONFIG_CLOCK_GETTIME 168 #define FIO_PREFERRED_CLOCK_SOURCE CS_CGETTIME 169 #else 170 #define FIO_PREFERRED_CLOCK_SOURCE CS_GTOD 171 #endif 172 #endif 173 174 #ifndef FIO_MAX_JOBS 175 #define FIO_MAX_JOBS 4096 176 #endif 177 178 #ifndef CONFIG_SOCKLEN_T 179 typedef unsigned int socklen_t; 180 #endif 181 182 #ifndef FIO_OS_HAS_CTIME_R 183 #define os_ctime_r(x, y, z) (void) ctime_r((x), (y)) 184 #endif 185 186 #ifdef FIO_USE_GENERIC_SWAP 187 static inline uint16_t fio_swap16(uint16_t val) 188 { 189 return (val << 8) | (val >> 8); 190 } 191 192 static inline uint32_t fio_swap32(uint32_t val) 193 { 194 val = ((val & 0xff00ff00UL) >> 8) | ((val & 0x00ff00ffUL) << 8); 195 196 return (val >> 16) | (val << 16); 197 } 198 199 static inline uint64_t fio_swap64(uint64_t val) 200 { 201 val = ((val & 0xff00ff00ff00ff00ULL) >> 8) | 202 ((val & 0x00ff00ff00ff00ffULL) << 8); 203 val = ((val & 0xffff0000ffff0000ULL) >> 16) | 204 ((val & 0x0000ffff0000ffffULL) << 16); 205 206 return (val >> 32) | (val << 32); 207 } 208 #endif 209 210 #ifndef FIO_HAVE_BYTEORDER_FUNCS 211 #ifdef CONFIG_LITTLE_ENDIAN 212 #define __le16_to_cpu(x) (x) 213 #define __le32_to_cpu(x) (x) 214 #define __le64_to_cpu(x) (x) 215 #define __cpu_to_le16(x) (x) 216 #define __cpu_to_le32(x) (x) 217 #define __cpu_to_le64(x) (x) 218 #else 219 #define __le16_to_cpu(x) fio_swap16(x) 220 #define __le32_to_cpu(x) fio_swap32(x) 221 #define __le64_to_cpu(x) fio_swap64(x) 222 #define __cpu_to_le16(x) fio_swap16(x) 223 #define __cpu_to_le32(x) fio_swap32(x) 224 #define __cpu_to_le64(x) fio_swap64(x) 225 #endif 226 #endif /* FIO_HAVE_BYTEORDER_FUNCS */ 227 228 #ifdef FIO_INTERNAL 229 #define le16_to_cpu(val) ({ \ 230 typecheck(uint16_t, val); \ 231 __le16_to_cpu(val); \ 232 }) 233 #define le32_to_cpu(val) ({ \ 234 typecheck(uint32_t, val); \ 235 __le32_to_cpu(val); \ 236 }) 237 #define le64_to_cpu(val) ({ \ 238 typecheck(uint64_t, val); \ 239 __le64_to_cpu(val); \ 240 }) 241 #endif 242 243 #define cpu_to_le16(val) ({ \ 244 typecheck(uint16_t, val); \ 245 __cpu_to_le16(val); \ 246 }) 247 #define cpu_to_le32(val) ({ \ 248 typecheck(uint32_t, val); \ 249 __cpu_to_le32(val); \ 250 }) 251 #define cpu_to_le64(val) ({ \ 252 typecheck(uint64_t, val); \ 253 __cpu_to_le64(val); \ 254 }) 255 256 #ifndef FIO_HAVE_BLKTRACE 257 static inline int is_blktrace(const char *fname, int *need_swap) 258 { 259 return 0; 260 } 261 struct thread_data; 262 static inline int load_blktrace(struct thread_data *td, const char *fname, 263 int need_swap) 264 { 265 return 1; 266 } 267 #endif 268 269 #define FIO_DEF_CL_SIZE 128 270 271 static inline int os_cache_line_size(void) 272 { 273 #ifdef FIO_HAVE_CL_SIZE 274 int ret = arch_cache_line_size(); 275 276 if (ret <= 0) 277 return FIO_DEF_CL_SIZE; 278 279 return ret; 280 #else 281 return FIO_DEF_CL_SIZE; 282 #endif 283 } 284 285 #ifdef FIO_USE_GENERIC_BDEV_SIZE 286 static inline int blockdev_size(struct fio_file *f, unsigned long long *bytes) 287 { 288 off_t end; 289 290 *bytes = 0; 291 292 end = lseek(f->fd, 0, SEEK_END); 293 if (end < 0) 294 return errno; 295 296 *bytes = end; 297 return 0; 298 } 299 #endif 300 301 #ifdef FIO_USE_GENERIC_RAND 302 typedef unsigned int os_random_state_t; 303 304 static inline void os_random_seed(unsigned long seed, os_random_state_t *rs) 305 { 306 srand(seed); 307 } 308 309 static inline long os_random_long(os_random_state_t *rs) 310 { 311 long val; 312 313 val = rand_r(rs); 314 return val; 315 } 316 #endif 317 318 #ifdef FIO_USE_GENERIC_INIT_RANDOM_STATE 319 extern void td_fill_rand_seeds(struct thread_data *td); 320 /* 321 * Initialize the various random states we need (random io, block size ranges, 322 * read/write mix, etc). 323 */ 324 static inline int init_random_state(struct thread_data *td, unsigned long *rand_seeds, int size) 325 { 326 int fd; 327 328 fd = open("/dev/urandom", O_RDONLY); 329 if (fd == -1) { 330 return 1; 331 } 332 333 if (read(fd, rand_seeds, size) < size) { 334 close(fd); 335 return 1; 336 } 337 338 close(fd); 339 td_fill_rand_seeds(td); 340 return 0; 341 } 342 #endif 343 344 #ifndef FIO_HAVE_FS_STAT 345 static inline unsigned long long get_fs_free_size(const char *path) 346 { 347 return 0; 348 } 349 #endif 350 351 #ifdef __powerpc64__ 352 #define FIO_HAVE_CPU_ONLINE_SYSCONF 353 static inline unsigned int cpus_online(void) 354 { 355 return sysconf(_SC_NPROCESSORS_CONF); 356 } 357 #endif 358 359 #ifndef FIO_HAVE_CPU_ONLINE_SYSCONF 360 static inline unsigned int cpus_online(void) 361 { 362 return sysconf(_SC_NPROCESSORS_ONLN); 363 } 364 #endif 365 366 #ifndef CPU_COUNT 367 #ifdef FIO_HAVE_CPU_AFFINITY 368 static inline int CPU_COUNT(os_cpu_mask_t *mask) 369 { 370 int max_cpus = cpus_online(); 371 int nr_cpus, i; 372 373 for (i = 0, nr_cpus = 0; i < max_cpus; i++) 374 if (fio_cpu_isset(mask, i)) 375 nr_cpus++; 376 377 return nr_cpus; 378 } 379 #endif 380 #endif 381 382 #ifndef FIO_HAVE_GETTID 383 static inline int gettid(void) 384 { 385 return getpid(); 386 } 387 #endif 388 389 #ifndef FIO_HAVE_SHM_ATTACH_REMOVED 390 static inline int shm_attach_to_open_removed(void) 391 { 392 return 0; 393 } 394 #endif 395 396 #endif 397