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