os.h revision 39b9356872f27c1a48a2ab09a5252dffd1de22d2
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 11enum { 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 54typedef 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 FIO_HAVE_FADVISE 72static inline int posix_fadvise(int fd, int off, int len, int advice) 73{ 74 (void)fd; 75 (void)off; 76 (void)len; 77 (void)advice; 78 return 0; 79} 80 81#ifndef POSIX_FADV_DONTNEED 82#define POSIX_FADV_DONTNEED (0) 83#define POSIX_FADV_SEQUENTIAL (0) 84#define POSIX_FADV_RANDOM (0) 85#endif 86#endif /* FIO_HAVE_FADVISE */ 87 88#ifndef FIO_HAVE_CPU_AFFINITY 89#define fio_setaffinity(pid, mask) (0) 90#define fio_getaffinity(pid, mask) do { } while (0) 91#define fio_cpu_clear(mask, cpu) do { } while (0) 92#define fio_cpuset_exit(mask) (-1) 93typedef unsigned long os_cpu_mask_t; 94#endif 95 96#ifndef FIO_HAVE_IOPRIO 97#define ioprio_set(which, who, prio) (0) 98#endif 99 100#ifndef FIO_HAVE_ODIRECT 101#define OS_O_DIRECT 0 102#else 103#define OS_O_DIRECT O_DIRECT 104#endif 105 106#ifndef FIO_HAVE_HUGETLB 107#define SHM_HUGETLB 0 108#define MAP_HUGETLB 0 109#ifndef FIO_HUGE_PAGE 110#define FIO_HUGE_PAGE 0 111#endif 112#else 113#ifndef FIO_HUGE_PAGE 114#define FIO_HUGE_PAGE 4194304 115#endif 116#endif 117 118#ifndef FIO_HAVE_MMAP_HUGE 119#define MAP_HUGETLB 0 120#endif 121 122#ifndef FIO_O_NOATIME 123#define FIO_O_NOATIME 0 124#endif 125 126#ifndef OS_RAND_MAX 127#define OS_RAND_MAX RAND_MAX 128#endif 129 130#ifdef FIO_HAVE_CLOCK_MONOTONIC 131#define FIO_TIMER_CLOCK CLOCK_MONOTONIC 132#else 133#define FIO_TIMER_CLOCK CLOCK_REALTIME 134#endif 135 136#ifndef FIO_HAVE_RAWBIND 137#define fio_lookup_raw(dev, majdev, mindev) 1 138#endif 139 140#ifndef FIO_PREFERRED_ENGINE 141#define FIO_PREFERRED_ENGINE "sync" 142#endif 143 144#ifndef FIO_OS_PATH_SEPARATOR 145#define FIO_OS_PATH_SEPARATOR "/" 146#endif 147 148#ifndef FIO_PREFERRED_CLOCK_SOURCE 149#define FIO_PREFERRED_CLOCK_SOURCE CS_CGETTIME 150#endif 151 152#ifndef FIO_MAX_JOBS 153#define FIO_MAX_JOBS 2048 154#endif 155 156#ifndef FIO_OS_HAVE_SOCKLEN_T 157typedef socklen_t fio_socklen_t; 158#endif 159 160#ifndef FIO_OS_HAS_CTIME_R 161#define os_ctime_r(x, y, z) ctime_r((x), (y)) 162#endif 163 164#ifdef FIO_USE_GENERIC_SWAP 165static inline uint16_t fio_swap16(uint16_t val) 166{ 167 return (val << 8) | (val >> 8); 168} 169 170static inline uint32_t fio_swap32(uint32_t val) 171{ 172 val = ((val & 0xff00ff00UL) >> 8) | ((val & 0x00ff00ffUL) << 8); 173 174 return (val >> 16) | (val << 16); 175} 176 177static inline uint64_t fio_swap64(uint64_t val) 178{ 179 val = ((val & 0xff00ff00ff00ff00ULL) >> 8) | 180 ((val & 0x00ff00ff00ff00ffULL) << 8); 181 val = ((val & 0xffff0000ffff0000ULL) >> 16) | 182 ((val & 0x0000ffff0000ffffULL) << 16); 183 184 return (val >> 32) | (val << 32); 185} 186#endif 187 188#ifndef FIO_HAVE_BYTEORDER_FUNCS 189#ifdef FIO_LITTLE_ENDIAN 190#define __le16_to_cpu(x) (x) 191#define __le32_to_cpu(x) (x) 192#define __le64_to_cpu(x) (x) 193#define __cpu_to_le16(x) (x) 194#define __cpu_to_le32(x) (x) 195#define __cpu_to_le64(x) (x) 196#else 197#define __le16_to_cpu(x) fio_swap16(x) 198#define __le32_to_cpu(x) fio_swap32(x) 199#define __le64_to_cpu(x) fio_swap64(x) 200#define __cpu_to_le16(x) fio_swap16(x) 201#define __cpu_to_le32(x) fio_swap32(x) 202#define __cpu_to_le64(x) fio_swap64(x) 203#endif 204#endif /* FIO_HAVE_BYTEORDER_FUNCS */ 205 206#define le16_to_cpu(val) ({ \ 207 uint16_t *__val = &(val); \ 208 __le16_to_cpu(*__val); \ 209}) 210#define le32_to_cpu(val) ({ \ 211 uint32_t *__val = &(val); \ 212 __le32_to_cpu(*__val); \ 213}) 214#define le64_to_cpu(val) ({ \ 215 uint64_t *__val = &(val); \ 216 __le64_to_cpu(*__val); \ 217}) 218#define cpu_to_le16(val) ({ \ 219 uint16_t *__val = &(val); \ 220 __cpu_to_le16(*__val); \ 221}) 222#define cpu_to_le32(val) ({ \ 223 uint32_t *__val = &(val); \ 224 __cpu_to_le32(*__val); \ 225}) 226#define cpu_to_le64(val) ({ \ 227 uint64_t *__val = &(val); \ 228 __cpu_to_le64(*__val); \ 229}) 230 231#ifndef FIO_HAVE_BLKTRACE 232static inline int is_blktrace(const char *fname) 233{ 234 return 0; 235} 236struct thread_data; 237static inline int load_blktrace(struct thread_data *td, const char *fname) 238{ 239 return 1; 240} 241#endif 242 243#define FIO_DEF_CL_SIZE 128 244 245static inline int os_cache_line_size(void) 246{ 247#ifdef FIO_HAVE_CL_SIZE 248 int ret = arch_cache_line_size(); 249 250 if (ret <= 0) 251 return FIO_DEF_CL_SIZE; 252 253 return ret; 254#else 255 return FIO_DEF_CL_SIZE; 256#endif 257} 258 259#ifdef FIO_USE_GENERIC_BDEV_SIZE 260static inline int blockdev_size(struct fio_file *f, unsigned long long *bytes) 261{ 262 off_t end; 263 264 *bytes = 0; 265 266 end = lseek(f->fd, 0, SEEK_END); 267 if (end < 0) 268 return errno; 269 270 *bytes = end; 271 return 0; 272} 273#endif 274 275#ifdef FIO_USE_GENERIC_RAND 276typedef unsigned int os_random_state_t; 277 278static inline void os_random_seed(unsigned long seed, os_random_state_t *rs) 279{ 280 srand(seed); 281} 282 283static inline long os_random_long(os_random_state_t *rs) 284{ 285 long val; 286 287 val = rand_r(rs); 288 return val; 289} 290#endif 291 292#ifdef FIO_USE_GENERIC_INIT_RANDOM_STATE 293extern void td_fill_rand_seeds(struct thread_data *td); 294/* 295 * Initialize the various random states we need (random io, block size ranges, 296 * read/write mix, etc). 297 */ 298static inline int init_random_state(struct thread_data *td, unsigned long *rand_seeds, int size) 299{ 300 int fd; 301 302 fd = open("/dev/urandom", O_RDONLY); 303 if (fd == -1) { 304 return 1; 305 } 306 307 if (read(fd, rand_seeds, size) < size) { 308 close(fd); 309 return 1; 310 } 311 312 close(fd); 313 td_fill_rand_seeds(td); 314 return 0; 315} 316#endif 317 318#ifndef FIO_HAVE_FS_STAT 319static inline unsigned long long get_fs_size(const char *path) 320{ 321 return 0; 322} 323#endif 324 325#ifndef FIO_HAVE_CPU_ONLINE_SYSCONF 326static inline unsigned int cpus_online(void) 327{ 328 return sysconf(_SC_NPROCESSORS_ONLN); 329} 330#endif 331 332#ifndef FIO_HAVE_GETTID 333static inline int gettid(void) 334{ 335 return getpid(); 336} 337#endif 338 339#endif 340