os.h revision 67bf982340d95ca98098ea050b54b4c7adb116c0
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 CONFIG_POSIXAIO 48#include <aio.h> 49#ifndef FIO_OS_HAVE_AIOCB_TYPEDEF 50typedef struct aiocb os_aiocb_t; 51#endif 52#endif 53 54#ifdef FIO_HAVE_SGIO 55#include <linux/fs.h> 56#include <scsi/sg.h> 57#endif 58 59#ifdef CONFIG_STRSEP 60#include "../lib/strsep.h" 61#endif 62 63#ifdef MSG_DONTWAIT 64#define OS_MSG_DONTWAIT MSG_DONTWAIT 65#endif 66 67#ifndef POSIX_FADV_DONTNEED 68#define POSIX_FADV_DONTNEED (0) 69#define POSIX_FADV_SEQUENTIAL (0) 70#define POSIX_FADV_RANDOM (0) 71#endif 72 73#ifndef FIO_HAVE_CPU_AFFINITY 74#define fio_setaffinity(pid, mask) (0) 75#define fio_getaffinity(pid, mask) do { } while (0) 76#define fio_cpu_clear(mask, cpu) do { } while (0) 77#define fio_cpuset_exit(mask) (-1) 78typedef unsigned long os_cpu_mask_t; 79#endif 80 81#ifndef FIO_HAVE_IOPRIO 82#define ioprio_set(which, who, prio) (0) 83#endif 84 85#ifndef FIO_HAVE_ODIRECT 86#define OS_O_DIRECT 0 87#else 88#define OS_O_DIRECT O_DIRECT 89#endif 90 91#ifndef FIO_HAVE_HUGETLB 92#define SHM_HUGETLB 0 93#define MAP_HUGETLB 0 94#ifndef FIO_HUGE_PAGE 95#define FIO_HUGE_PAGE 0 96#endif 97#else 98#ifndef FIO_HUGE_PAGE 99#define FIO_HUGE_PAGE 4194304 100#endif 101#endif 102 103#ifndef FIO_HAVE_MMAP_HUGE 104#define MAP_HUGETLB 0 105#endif 106 107#ifndef FIO_O_NOATIME 108#define FIO_O_NOATIME 0 109#endif 110 111#ifndef OS_RAND_MAX 112#define OS_RAND_MAX RAND_MAX 113#endif 114 115#ifndef FIO_HAVE_RAWBIND 116#define fio_lookup_raw(dev, majdev, mindev) 1 117#endif 118 119#ifndef FIO_PREFERRED_ENGINE 120#define FIO_PREFERRED_ENGINE "sync" 121#endif 122 123#ifndef FIO_OS_PATH_SEPARATOR 124#define FIO_OS_PATH_SEPARATOR "/" 125#endif 126 127#ifndef FIO_PREFERRED_CLOCK_SOURCE 128#define FIO_PREFERRED_CLOCK_SOURCE CS_CGETTIME 129#endif 130 131#ifndef FIO_MAX_JOBS 132#define FIO_MAX_JOBS 2048 133#endif 134 135#ifndef CONFIG_SOCKLEN_T 136typedef unsigned int socklen_t; 137#endif 138 139#ifndef FIO_OS_HAS_CTIME_R 140#define os_ctime_r(x, y, z) ctime_r((x), (y)) 141#endif 142 143#ifdef FIO_USE_GENERIC_SWAP 144static inline uint16_t fio_swap16(uint16_t val) 145{ 146 return (val << 8) | (val >> 8); 147} 148 149static inline uint32_t fio_swap32(uint32_t val) 150{ 151 val = ((val & 0xff00ff00UL) >> 8) | ((val & 0x00ff00ffUL) << 8); 152 153 return (val >> 16) | (val << 16); 154} 155 156static inline uint64_t fio_swap64(uint64_t val) 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 167#ifndef FIO_HAVE_BYTEORDER_FUNCS 168#ifdef FIO_LITTLE_ENDIAN 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 183#endif /* FIO_HAVE_BYTEORDER_FUNCS */ 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 210#ifndef FIO_HAVE_BLKTRACE 211static inline int is_blktrace(const char *fname) 212{ 213 return 0; 214} 215struct thread_data; 216static inline int load_blktrace(struct thread_data *td, const char *fname) 217{ 218 return 1; 219} 220#endif 221 222#define FIO_DEF_CL_SIZE 128 223 224static 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 238#ifdef FIO_USE_GENERIC_BDEV_SIZE 239static inline int blockdev_size(struct fio_file *f, unsigned long long *bytes) 240{ 241 off_t end; 242 243 *bytes = 0; 244 245 end = lseek(f->fd, 0, SEEK_END); 246 if (end < 0) 247 return errno; 248 249 *bytes = end; 250 return 0; 251} 252#endif 253 254#ifdef FIO_USE_GENERIC_RAND 255typedef unsigned int os_random_state_t; 256 257static inline void os_random_seed(unsigned long seed, os_random_state_t *rs) 258{ 259 srand(seed); 260} 261 262static 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 271#ifdef FIO_USE_GENERIC_INIT_RANDOM_STATE 272extern 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 */ 277static 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 297#ifndef FIO_HAVE_FS_STAT 298static inline unsigned long long get_fs_size(const char *path) 299{ 300 return 0; 301} 302#endif 303 304#ifndef FIO_HAVE_CPU_ONLINE_SYSCONF 305static inline unsigned int cpus_online(void) 306{ 307 return sysconf(_SC_NPROCESSORS_ONLN); 308} 309#endif 310 311#ifndef FIO_HAVE_GETTID 312static inline int gettid(void) 313{ 314 return getpid(); 315} 316#endif 317 318#endif 319