os.h revision 93bcfd20e37cef8cec350fe06d3a086724c9f257
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 21 os_nr, 22}; 23 24#if defined(__linux__) 25#include "os-linux.h" 26#elif defined(__FreeBSD__) 27#include "os-freebsd.h" 28#elif defined(__NetBSD__) 29#include "os-netbsd.h" 30#elif defined(__sun__) 31#include "os-solaris.h" 32#elif defined(__APPLE__) 33#include "os-mac.h" 34#elif defined(_AIX) 35#include "os-aix.h" 36#elif defined(__hpux) 37#include "os-hpux.h" 38#elif defined(WIN32) 39#include "os-windows.h" 40#else 41#error "unsupported os" 42#endif 43 44#ifdef FIO_HAVE_LIBAIO 45#include <libaio.h> 46#endif 47 48#ifdef FIO_HAVE_POSIXAIO 49#include <aio.h> 50#ifndef FIO_OS_HAVE_AIOCB_TYPEDEF 51typedef struct aiocb os_aiocb_t; 52#endif 53#endif 54 55#ifdef FIO_HAVE_SGIO 56#include <linux/fs.h> 57#include <scsi/sg.h> 58#endif 59 60#ifndef FIO_HAVE_STRSEP 61#include "../lib/strsep.h" 62#endif 63 64#ifdef MSG_DONTWAIT 65#define OS_MSG_DONTWAIT MSG_DONTWAIT 66#endif 67 68#ifndef FIO_HAVE_FADVISE 69#define posix_fadvise(fd, off, len, advice) (0) 70 71#ifndef POSIX_FADV_DONTNEED 72#define POSIX_FADV_DONTNEED (0) 73#define POSIX_FADV_SEQUENTIAL (0) 74#define POSIX_FADV_RANDOM (0) 75#endif 76#endif /* FIO_HAVE_FADVISE */ 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) 83typedef unsigned long os_cpu_mask_t; 84#endif 85 86#ifndef FIO_HAVE_IOPRIO 87#define ioprio_set(which, who, prio) (0) 88#endif 89 90#ifndef FIO_HAVE_ODIRECT 91#define OS_O_DIRECT 0 92#else 93#define OS_O_DIRECT O_DIRECT 94#endif 95 96#ifndef FIO_HAVE_HUGETLB 97#define SHM_HUGETLB 0 98#ifndef FIO_HUGE_PAGE 99#define FIO_HUGE_PAGE 0 100#endif 101#else 102#ifndef FIO_HUGE_PAGE 103#define FIO_HUGE_PAGE 4194304 104#endif 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#ifdef FIO_HAVE_CLOCK_MONOTONIC 116#define FIO_TIMER_CLOCK CLOCK_MONOTONIC 117#else 118#define FIO_TIMER_CLOCK CLOCK_REALTIME 119#endif 120 121#ifndef FIO_HAVE_RAWBIND 122#define fio_lookup_raw(dev, majdev, mindev) 1 123#endif 124 125#ifndef FIO_PREFERRED_ENGINE 126#define FIO_PREFERRED_ENGINE "sync" 127#endif 128 129#ifndef FIO_OS_PATH_SEPARATOR 130#define FIO_OS_PATH_SEPARATOR "/" 131#endif 132 133#ifndef FIO_PREFERRED_CLOCK_SOURCE 134#define FIO_PREFERRED_CLOCK_SOURCE CS_CGETTIME 135#endif 136 137#ifndef FIO_MAX_JOBS 138#define FIO_MAX_JOBS 2048 139#endif 140 141#ifndef FIO_OS_HAVE_SOCKLEN_T 142typedef socklen_t fio_socklen_t; 143#endif 144 145#ifdef FIO_USE_GENERIC_SWAP 146static inline uint16_t fio_swap16(uint16_t val) 147{ 148 return (val << 8) | (val >> 8); 149} 150 151static inline uint32_t fio_swap32(uint32_t val) 152{ 153 val = ((val & 0xff00ff00UL) >> 8) | ((val & 0x00ff00ffUL) << 8); 154 155 return (val >> 16) | (val << 16); 156} 157 158static inline uint64_t fio_swap64(uint64_t val) 159{ 160 val = ((val & 0xff00ff00ff00ff00ULL) >> 8) | 161 ((val & 0x00ff00ff00ff00ffULL) << 8); 162 val = ((val & 0xffff0000ffff0000ULL) >> 16) | 163 ((val & 0x0000ffff0000ffffULL) << 16); 164 165 return (val >> 32) | (val << 32); 166} 167#endif 168 169#ifdef FIO_LITTLE_ENDIAN 170#define __le16_to_cpu(x) (x) 171#define __le32_to_cpu(x) (x) 172#define __le64_to_cpu(x) (x) 173#define __cpu_to_le16(x) (x) 174#define __cpu_to_le32(x) (x) 175#define __cpu_to_le64(x) (x) 176#else 177#define __le16_to_cpu(x) fio_swap16(x) 178#define __le32_to_cpu(x) fio_swap32(x) 179#define __le64_to_cpu(x) fio_swap64(x) 180#define __cpu_to_le16(x) fio_swap16(x) 181#define __cpu_to_le32(x) fio_swap32(x) 182#define __cpu_to_le64(x) fio_swap64(x) 183#endif 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