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 14enum { 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 59typedef 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) 89typedef unsigned long os_cpu_mask_t; 90 91static inline int fio_setaffinity(int pid, os_cpu_mask_t cpumask) 92{ 93 return 0; 94} 95 96static inline int fio_getaffinity(int pid, os_cpu_mask_t *cpumask) 97{ 98 return -1; 99} 100 101static inline int fio_cpuset_exit(os_cpu_mask_t *mask) 102{ 103 return -1; 104} 105 106static inline int fio_cpus_split(os_cpu_mask_t *mask, unsigned int cpu_index) 107{ 108 return 0; 109} 110#else 111extern 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 179typedef 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 187static inline uint16_t fio_swap16(uint16_t val) 188{ 189 return (val << 8) | (val >> 8); 190} 191 192static 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 199static 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 257static inline int is_blktrace(const char *fname, int *need_swap) 258{ 259 return 0; 260} 261struct thread_data; 262static 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 271static 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 286static 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 302typedef unsigned int os_random_state_t; 303 304static inline void os_random_seed(unsigned long seed, os_random_state_t *rs) 305{ 306 srand(seed); 307} 308 309static 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 319extern 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 */ 324static 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 345static 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 353static inline unsigned int cpus_online(void) 354{ 355 return sysconf(_SC_NPROCESSORS_CONF); 356} 357#endif 358 359#ifndef FIO_HAVE_CPU_ONLINE_SYSCONF 360static 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 368static 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 383static inline int gettid(void) 384{ 385 return getpid(); 386} 387#endif 388 389#ifndef FIO_HAVE_SHM_ATTACH_REMOVED 390static inline int shm_attach_to_open_removed(void) 391{ 392 return 0; 393} 394#endif 395 396#endif 397