| Jens Axboe | ebac465 | 2005-12-08 15:25:21 +0100 | [diff] [blame] | 1 | #ifndef FIO_OS_H | 
 | 2 | #define FIO_OS_H | 
 | 3 |  | 
| Jens Axboe | a14ca44 | 2009-12-20 22:24:10 +0100 | [diff] [blame] | 4 | #include <sys/types.h> | 
| Bruce Cran | 203913e | 2011-10-18 12:20:56 +0200 | [diff] [blame] | 5 | #include <sys/socket.h> | 
| Bruce Cran | 03e20d6 | 2011-01-02 20:14:54 +0100 | [diff] [blame] | 6 | #include <pthread.h> | 
| Jens Axboe | a14ca44 | 2009-12-20 22:24:10 +0100 | [diff] [blame] | 7 | #include <unistd.h> | 
| Bruce Cran | ecc314b | 2011-01-04 10:59:30 +0100 | [diff] [blame] | 8 | #include <stdlib.h> | 
| Jens Axboe | a14ca44 | 2009-12-20 22:24:10 +0100 | [diff] [blame] | 9 |  | 
| Jens Axboe | cca8464 | 2011-10-07 12:47:57 +0200 | [diff] [blame] | 10 | enum { | 
 | 11 | 	os_linux = 1, | 
 | 12 | 	os_aix, | 
 | 13 | 	os_freebsd, | 
 | 14 | 	os_hpux, | 
 | 15 | 	os_mac, | 
 | 16 | 	os_netbsd, | 
 | 17 | 	os_solaris, | 
 | 18 | 	os_windows, | 
 | 19 |  | 
 | 20 | 	os_nr, | 
 | 21 | }; | 
 | 22 |  | 
| Jens Axboe | ebac465 | 2005-12-08 15:25:21 +0100 | [diff] [blame] | 23 | #if defined(__linux__) | 
 | 24 | #include "os-linux.h" | 
 | 25 | #elif defined(__FreeBSD__) | 
 | 26 | #include "os-freebsd.h" | 
| YAMAMOTO Takashi | 7452440 | 2010-05-12 15:06:46 +0200 | [diff] [blame] | 27 | #elif defined(__NetBSD__) | 
 | 28 | #include "os-netbsd.h" | 
| Jens Axboe | 2c0ecd2 | 2006-06-08 13:25:41 +0200 | [diff] [blame] | 29 | #elif defined(__sun__) | 
 | 30 | #include "os-solaris.h" | 
| Jens Axboe | 2afd826 | 2009-12-14 23:08:42 +0100 | [diff] [blame] | 31 | #elif defined(__APPLE__) | 
 | 32 | #include "os-mac.h" | 
| Cigy Cyriac | bf2e821 | 2010-08-10 19:51:11 -0400 | [diff] [blame] | 33 | #elif defined(_AIX) | 
 | 34 | #include "os-aix.h" | 
| Jens Axboe | c00a228 | 2011-07-08 20:56:06 +0200 | [diff] [blame] | 35 | #elif defined(__hpux) | 
 | 36 | #include "os-hpux.h" | 
| Bruce Cran | 03e20d6 | 2011-01-02 20:14:54 +0100 | [diff] [blame] | 37 | #elif defined(__CYGWIN__) | 
 | 38 | #include "os-windows.h" | 
| Jens Axboe | ebac465 | 2005-12-08 15:25:21 +0100 | [diff] [blame] | 39 | #else | 
 | 40 | #error "unsupported os" | 
 | 41 | #endif | 
 | 42 |  | 
 | 43 | #ifdef FIO_HAVE_LIBAIO | 
 | 44 | #include <libaio.h> | 
 | 45 | #endif | 
 | 46 |  | 
 | 47 | #ifdef FIO_HAVE_POSIXAIO | 
 | 48 | #include <aio.h> | 
| Jens Axboe | e97c144 | 2011-09-21 09:38:01 +0200 | [diff] [blame] | 49 | #ifndef FIO_OS_HAVE_AIOCB_TYPEDEF | 
 | 50 | typedef struct aiocb os_aiocb_t; | 
 | 51 | #endif | 
| Jens Axboe | ebac465 | 2005-12-08 15:25:21 +0100 | [diff] [blame] | 52 | #endif | 
 | 53 |  | 
 | 54 | #ifdef FIO_HAVE_SGIO | 
 | 55 | #include <linux/fs.h> | 
 | 56 | #include <scsi/sg.h> | 
 | 57 | #endif | 
 | 58 |  | 
| Jens Axboe | 5921e80 | 2008-05-30 15:02:38 +0200 | [diff] [blame] | 59 | #ifndef FIO_HAVE_STRSEP | 
| Jens Axboe | 00fb3c8 | 2008-05-30 22:17:45 +0200 | [diff] [blame] | 60 | #include "../lib/strsep.h" | 
| Jens Axboe | 5921e80 | 2008-05-30 15:02:38 +0200 | [diff] [blame] | 61 | #endif | 
 | 62 |  | 
| Jens Axboe | 8e239ca | 2010-08-11 10:29:12 -0400 | [diff] [blame] | 63 | #ifdef MSG_DONTWAIT | 
 | 64 | #define OS_MSG_DONTWAIT	MSG_DONTWAIT | 
 | 65 | #endif | 
 | 66 |  | 
| Jens Axboe | ebac465 | 2005-12-08 15:25:21 +0100 | [diff] [blame] | 67 | #ifndef FIO_HAVE_FADVISE | 
| Bruce Cran | ecc314b | 2011-01-04 10:59:30 +0100 | [diff] [blame] | 68 | #define posix_fadvise(fd, off, len, advice)	(0) | 
| Jens Axboe | ebac465 | 2005-12-08 15:25:21 +0100 | [diff] [blame] | 69 |  | 
| Shawn Lewis | 4d8947d | 2007-07-25 07:51:58 +0200 | [diff] [blame] | 70 | #ifndef POSIX_FADV_DONTNEED | 
| Jens Axboe | ebac465 | 2005-12-08 15:25:21 +0100 | [diff] [blame] | 71 | #define POSIX_FADV_DONTNEED	(0) | 
 | 72 | #define POSIX_FADV_SEQUENTIAL	(0) | 
 | 73 | #define POSIX_FADV_RANDOM	(0) | 
| Shawn Lewis | 4d8947d | 2007-07-25 07:51:58 +0200 | [diff] [blame] | 74 | #endif | 
| Jens Axboe | ebac465 | 2005-12-08 15:25:21 +0100 | [diff] [blame] | 75 | #endif /* FIO_HAVE_FADVISE */ | 
 | 76 |  | 
 | 77 | #ifndef FIO_HAVE_CPU_AFFINITY | 
| Jens Axboe | e8462bd | 2009-07-06 12:59:04 +0200 | [diff] [blame] | 78 | #define fio_setaffinity(pid, mask)	(0) | 
| Jens Axboe | be4ecfd | 2008-12-08 14:10:52 +0100 | [diff] [blame] | 79 | #define fio_getaffinity(pid, mask)	do { } while (0) | 
 | 80 | #define fio_cpu_clear(mask, cpu)	do { } while (0) | 
| Jens Axboe | 85daf2c | 2009-01-05 09:40:13 +0100 | [diff] [blame] | 81 | #define fio_cpuset_exit(mask)		(-1) | 
| YAMAMOTO Takashi | 7452440 | 2010-05-12 15:06:46 +0200 | [diff] [blame] | 82 | typedef unsigned long os_cpu_mask_t; | 
| Jens Axboe | ebac465 | 2005-12-08 15:25:21 +0100 | [diff] [blame] | 83 | #endif | 
 | 84 |  | 
 | 85 | #ifndef FIO_HAVE_IOPRIO | 
 | 86 | #define ioprio_set(which, who, prio)	(0) | 
 | 87 | #endif | 
 | 88 |  | 
| Jens Axboe | 2c0ecd2 | 2006-06-08 13:25:41 +0200 | [diff] [blame] | 89 | #ifndef FIO_HAVE_ODIRECT | 
| Jens Axboe | 7d42476 | 2006-06-08 13:26:31 +0200 | [diff] [blame] | 90 | #define OS_O_DIRECT			0 | 
 | 91 | #else | 
 | 92 | #define OS_O_DIRECT			O_DIRECT | 
| Jens Axboe | 2c0ecd2 | 2006-06-08 13:25:41 +0200 | [diff] [blame] | 93 | #endif | 
 | 94 |  | 
| Jens Axboe | 74b025b | 2006-12-19 15:18:14 +0100 | [diff] [blame] | 95 | #ifndef FIO_HAVE_HUGETLB | 
 | 96 | #define SHM_HUGETLB			0 | 
| Shawn Lewis | 4d8947d | 2007-07-25 07:51:58 +0200 | [diff] [blame] | 97 | #ifndef FIO_HUGE_PAGE | 
| Jens Axboe | 74b025b | 2006-12-19 15:18:14 +0100 | [diff] [blame] | 98 | #define FIO_HUGE_PAGE			0 | 
| Shawn Lewis | 4d8947d | 2007-07-25 07:51:58 +0200 | [diff] [blame] | 99 | #endif | 
| Jens Axboe | 74b025b | 2006-12-19 15:18:14 +0100 | [diff] [blame] | 100 | #else | 
| Jens Axboe | cb25df6 | 2007-03-23 08:23:30 +0100 | [diff] [blame] | 101 | #ifndef FIO_HUGE_PAGE | 
| Jens Axboe | ee0e0a7 | 2007-03-19 10:50:47 +0100 | [diff] [blame] | 102 | #define FIO_HUGE_PAGE			4194304 | 
| Jens Axboe | 74b025b | 2006-12-19 15:18:14 +0100 | [diff] [blame] | 103 | #endif | 
| Jens Axboe | cb25df6 | 2007-03-23 08:23:30 +0100 | [diff] [blame] | 104 | #endif | 
| Jens Axboe | 74b025b | 2006-12-19 15:18:14 +0100 | [diff] [blame] | 105 |  | 
| Jens Axboe | 5921e80 | 2008-05-30 15:02:38 +0200 | [diff] [blame] | 106 | #ifndef FIO_O_NOATIME | 
 | 107 | #define FIO_O_NOATIME			0 | 
 | 108 | #endif | 
 | 109 |  | 
| Jens Axboe | dc873b6 | 2008-06-04 20:13:04 +0200 | [diff] [blame] | 110 | #ifndef OS_RAND_MAX | 
 | 111 | #define OS_RAND_MAX			RAND_MAX | 
 | 112 | #endif | 
 | 113 |  | 
| Bruce Cran | ecc314b | 2011-01-04 10:59:30 +0100 | [diff] [blame] | 114 | #ifdef FIO_HAVE_CLOCK_MONOTONIC | 
 | 115 | #define FIO_TIMER_CLOCK CLOCK_MONOTONIC | 
 | 116 | #else | 
 | 117 | #define FIO_TIMER_CLOCK CLOCK_REALTIME | 
 | 118 | #endif | 
 | 119 |  | 
| Jens Axboe | 07e5b26 | 2007-04-02 14:46:07 +0200 | [diff] [blame] | 120 | #ifndef FIO_HAVE_RAWBIND | 
| Jens Axboe | 8cc7afa | 2007-04-17 09:06:43 +0200 | [diff] [blame] | 121 | #define fio_lookup_raw(dev, majdev, mindev)	1 | 
| Jens Axboe | 07e5b26 | 2007-04-02 14:46:07 +0200 | [diff] [blame] | 122 | #endif | 
 | 123 |  | 
| Jens Axboe | 58483fa | 2011-01-19 11:09:58 -0700 | [diff] [blame] | 124 | #ifndef FIO_PREFERRED_ENGINE | 
 | 125 | #define FIO_PREFERRED_ENGINE	"sync" | 
 | 126 | #endif | 
 | 127 |  | 
| Bruce Cran | b9fd788 | 2012-02-20 17:01:46 +0000 | [diff] [blame] | 128 | #ifndef FIO_OS_PATH_SEPARATOR | 
 | 129 | #define FIO_OS_PATH_SEPARATOR	"/" | 
 | 130 | #endif | 
 | 131 |  | 
| Bruce Cran | 16de1bf | 2012-02-20 17:07:32 +0000 | [diff] [blame^] | 132 | #ifndef FIO_PREFERRED_CLOCK_SOURCE | 
 | 133 | #define FIO_PREFERRED_CLOCK_SOURCE	CS_CGETTIME | 
 | 134 | #endif | 
 | 135 |  | 
| Jens Axboe | fca7035 | 2011-07-06 20:12:54 +0200 | [diff] [blame] | 136 | #ifndef FIO_MAX_JOBS | 
 | 137 | #define FIO_MAX_JOBS		2048 | 
 | 138 | #endif | 
 | 139 |  | 
| Jens Axboe | 5ba13ea | 2011-10-04 23:50:28 +0200 | [diff] [blame] | 140 | #ifndef FIO_OS_HAVE_SOCKLEN_T | 
 | 141 | typedef socklen_t fio_socklen_t; | 
 | 142 | #endif | 
 | 143 |  | 
| Jens Axboe | 901ebe1 | 2011-10-04 23:31:00 +0200 | [diff] [blame] | 144 | #ifdef FIO_USE_GENERIC_SWAP | 
| Jens Axboe | 9677bec | 2011-10-04 16:02:51 +0200 | [diff] [blame] | 145 | static inline uint16_t fio_swap16(uint16_t val) | 
| Jens Axboe | 232f9b7 | 2011-10-04 14:45:20 +0200 | [diff] [blame] | 146 | { | 
 | 147 | 	return (val << 8) | (val >> 8); | 
 | 148 | } | 
 | 149 |  | 
| Jens Axboe | 901ebe1 | 2011-10-04 23:31:00 +0200 | [diff] [blame] | 150 | static inline uint32_t fio_swap32(uint32_t val) | 
| Jens Axboe | 232f9b7 | 2011-10-04 14:45:20 +0200 | [diff] [blame] | 151 | { | 
 | 152 | 	val = ((val & 0xff00ff00UL) >> 8) | ((val & 0x00ff00ffUL) << 8); | 
 | 153 |  | 
 | 154 | 	return (val >> 16) | (val << 16); | 
 | 155 | } | 
 | 156 |  | 
| Jens Axboe | 901ebe1 | 2011-10-04 23:31:00 +0200 | [diff] [blame] | 157 | static inline uint64_t fio_swap64(uint64_t val) | 
| Jens Axboe | 232f9b7 | 2011-10-04 14:45:20 +0200 | [diff] [blame] | 158 | { | 
 | 159 | 	val = ((val & 0xff00ff00ff00ff00ULL) >> 8) | | 
 | 160 | 	      ((val & 0x00ff00ff00ff00ffULL) << 8); | 
 | 161 | 	val = ((val & 0xffff0000ffff0000ULL) >> 16) | | 
 | 162 | 	      ((val & 0x0000ffff0000ffffULL) << 16); | 
 | 163 |  | 
 | 164 | 	return (val >> 32) | (val << 32); | 
 | 165 | } | 
 | 166 | #endif | 
 | 167 |  | 
| Jens Axboe | 8111092 | 2011-10-05 12:40:49 +0200 | [diff] [blame] | 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 |  | 
 | 184 | #define le16_to_cpu(val) ({			\ | 
 | 185 | 	uint16_t *__val = &(val);		\ | 
 | 186 | 	__le16_to_cpu(*__val);			\ | 
 | 187 | }) | 
 | 188 | #define le32_to_cpu(val) ({			\ | 
 | 189 | 	uint32_t *__val = &(val);		\ | 
 | 190 | 	__le32_to_cpu(*__val);			\ | 
 | 191 | }) | 
 | 192 | #define le64_to_cpu(val) ({			\ | 
 | 193 | 	uint64_t *__val = &(val);		\ | 
 | 194 | 	__le64_to_cpu(*__val);			\ | 
 | 195 | }) | 
 | 196 | #define cpu_to_le16(val) ({			\ | 
 | 197 | 	uint16_t *__val = &(val);		\ | 
 | 198 | 	__cpu_to_le16(*__val);			\ | 
 | 199 | }) | 
 | 200 | #define cpu_to_le32(val) ({			\ | 
 | 201 | 	uint32_t *__val = &(val);		\ | 
 | 202 | 	__cpu_to_le32(*__val);			\ | 
 | 203 | }) | 
 | 204 | #define cpu_to_le64(val) ({			\ | 
 | 205 | 	uint64_t *__val = &(val);		\ | 
 | 206 | 	__cpu_to_le64(*__val);			\ | 
 | 207 | }) | 
 | 208 |  | 
| Jens Axboe | 5e62c22 | 2007-05-22 13:27:30 +0200 | [diff] [blame] | 209 | #ifndef FIO_HAVE_BLKTRACE | 
 | 210 | static inline int is_blktrace(const char *fname) | 
 | 211 | { | 
 | 212 | 	return 0; | 
 | 213 | } | 
| Jens Axboe | 5921e80 | 2008-05-30 15:02:38 +0200 | [diff] [blame] | 214 | struct thread_data; | 
| Jens Axboe | 5e62c22 | 2007-05-22 13:27:30 +0200 | [diff] [blame] | 215 | static inline int load_blktrace(struct thread_data *td, const char *fname) | 
 | 216 | { | 
 | 217 | 	return 1; | 
 | 218 | } | 
 | 219 | #endif | 
 | 220 |  | 
| Jens Axboe | eb7ccf3 | 2009-04-29 09:48:04 +0200 | [diff] [blame] | 221 | #define FIO_DEF_CL_SIZE		128 | 
 | 222 |  | 
 | 223 | static inline int os_cache_line_size(void) | 
 | 224 | { | 
 | 225 | #ifdef FIO_HAVE_CL_SIZE | 
 | 226 | 	int ret = arch_cache_line_size(); | 
 | 227 |  | 
 | 228 | 	if (ret <= 0) | 
 | 229 | 		return FIO_DEF_CL_SIZE; | 
 | 230 |  | 
 | 231 | 	return ret; | 
 | 232 | #else | 
 | 233 | 	return FIO_DEF_CL_SIZE; | 
 | 234 | #endif | 
 | 235 | } | 
 | 236 |  | 
| Jens Axboe | 792d551 | 2009-09-22 17:12:29 +0200 | [diff] [blame] | 237 | #ifdef FIO_USE_GENERIC_BDEV_SIZE | 
| Bruce Cran | ecc314b | 2011-01-04 10:59:30 +0100 | [diff] [blame] | 238 | static inline int blockdev_size(struct fio_file *f, unsigned long long *bytes) | 
| Jens Axboe | 792d551 | 2009-09-22 17:12:29 +0200 | [diff] [blame] | 239 | { | 
| Jens Axboe | 3b2e146 | 2009-12-15 08:58:10 +0100 | [diff] [blame] | 240 | 	off_t end; | 
| Jens Axboe | 792d551 | 2009-09-22 17:12:29 +0200 | [diff] [blame] | 241 |  | 
| Jens Axboe | 3b2e146 | 2009-12-15 08:58:10 +0100 | [diff] [blame] | 242 | 	*bytes = 0; | 
 | 243 |  | 
| Bruce Cran | ecc314b | 2011-01-04 10:59:30 +0100 | [diff] [blame] | 244 | 	end = lseek(f->fd, 0, SEEK_END); | 
| Jens Axboe | 792d551 | 2009-09-22 17:12:29 +0200 | [diff] [blame] | 245 | 	if (end < 0) | 
 | 246 | 		return errno; | 
 | 247 |  | 
 | 248 | 	*bytes = end; | 
 | 249 | 	return 0; | 
 | 250 | } | 
 | 251 | #endif | 
 | 252 |  | 
| Jens Axboe | 5353137 | 2009-12-15 10:28:37 +0100 | [diff] [blame] | 253 | #ifdef FIO_USE_GENERIC_RAND | 
 | 254 | typedef unsigned int os_random_state_t; | 
 | 255 |  | 
 | 256 | static inline void os_random_seed(unsigned long seed, os_random_state_t *rs) | 
 | 257 | { | 
 | 258 | 	srand(seed); | 
 | 259 | } | 
 | 260 |  | 
 | 261 | static inline long os_random_long(os_random_state_t *rs) | 
 | 262 | { | 
 | 263 | 	long val; | 
 | 264 |  | 
 | 265 | 	val = rand_r(rs); | 
 | 266 | 	return val; | 
 | 267 | } | 
 | 268 | #endif | 
 | 269 |  | 
| Jens Axboe | 2e3bd4c | 2010-05-17 12:29:57 +0200 | [diff] [blame] | 270 | #ifndef FIO_HAVE_FS_STAT | 
 | 271 | static inline unsigned long long get_fs_size(const char *path) | 
 | 272 | { | 
 | 273 | 	return 0; | 
 | 274 | } | 
 | 275 | #endif | 
 | 276 |  | 
| Jens Axboe | c00a228 | 2011-07-08 20:56:06 +0200 | [diff] [blame] | 277 | #ifndef FIO_HAVE_CPU_ONLINE_SYSCONF | 
 | 278 | static inline unsigned int cpus_online(void) | 
 | 279 | { | 
 | 280 | 	return sysconf(_SC_NPROCESSORS_ONLN); | 
 | 281 | } | 
 | 282 | #endif | 
 | 283 |  | 
| Jens Axboe | 47f767c | 2011-07-12 21:17:49 +0200 | [diff] [blame] | 284 | #ifndef FIO_HAVE_GETTID | 
 | 285 | static inline int gettid(void) | 
 | 286 | { | 
 | 287 | 	return getpid(); | 
 | 288 | } | 
 | 289 | #endif | 
 | 290 |  | 
| Jens Axboe | ebac465 | 2005-12-08 15:25:21 +0100 | [diff] [blame] | 291 | #endif |