12c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboe#ifndef FIO_OS_SOLARIS_H 22c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboe#define FIO_OS_SOLARIS_H 32c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboe 4cca84643cc10cd72b0b453ff92ccb8643ba51493Jens Axboe#define FIO_OS os_solaris 5cca84643cc10cd72b0b453ff92ccb8643ba51493Jens Axboe 6690dec6e4ec7297a477b809fa24ee23dc02348c9Jens Axboe#include <errno.h> 7f8ed6d895233a874ce4e119f24d759445dff254dJens Axboe#include <malloc.h> 896ed30cee2c29a61a7c45ab56335ff23d70e377dJens Axboe#include <unistd.h> 9e116f2b90f110334e77741227ad4e4600302c718Jens Axboe#include <sys/types.h> 10e116f2b90f110334e77741227ad4e4600302c718Jens Axboe#include <sys/fcntl.h> 116f7024e49e41fafcb838acbebf0c31fbcf35132fJens Axboe#include <sys/pset.h> 1208987f0e7f255968ed4780ba3a8ed0cb1bb63904Jens Axboe#include <sys/mman.h> 1308987f0e7f255968ed4780ba3a8ed0cb1bb63904Jens Axboe#include <sys/dkio.h> 14232f9b73353e0322fe135d3029beecedaed7a17bJens Axboe#include <sys/byteorder.h> 15e116f2b90f110334e77741227ad4e4600302c718Jens Axboe 16e2e58886427019b525d2a234c5404a38ec0c7ebfJens Axboe#include "../file.h" 17e2e58886427019b525d2a234c5404a38ec0c7ebfJens Axboe 186f7024e49e41fafcb838acbebf0c31fbcf35132fJens Axboe#define FIO_HAVE_CPU_AFFINITY 19f356d01d0cf8fec2ee58f66a9b5c00c93defbc47Jens Axboe#define FIO_HAVE_PSHARED_MUTEX 2008987f0e7f255968ed4780ba3a8ed0cb1bb63904Jens Axboe#define FIO_HAVE_CHARDEV_SIZE 2108987f0e7f255968ed4780ba3a8ed0cb1bb63904Jens Axboe#define FIO_USE_GENERIC_BDEV_SIZE 2293bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define FIO_USE_GENERIC_INIT_RANDOM_STATE 23862745bf1f85ded2109a72e75a0070eb84900612Jens Axboe#define FIO_HAVE_GETTID 242c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboe 25dc873b6f4a536c332b72cce268d5a7ccd356a891Jens Axboe#define OS_MAP_ANON MAP_ANON 26dc873b6f4a536c332b72cce268d5a7ccd356a891Jens Axboe#define OS_RAND_MAX 2147483648UL 272c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboe 28232f9b73353e0322fe135d3029beecedaed7a17bJens Axboe#define fio_swap16(x) BSWAP_16(x) 29232f9b73353e0322fe135d3029beecedaed7a17bJens Axboe#define fio_swap32(x) BSWAP_32(x) 30232f9b73353e0322fe135d3029beecedaed7a17bJens Axboe#define fio_swap64(x) BSWAP_64(x) 31232f9b73353e0322fe135d3029beecedaed7a17bJens Axboe 32f022ddb71f93b5d9e32261491284b9881fceaf0cJens Axboestruct solaris_rand_seed { 33f022ddb71f93b5d9e32261491284b9881fceaf0cJens Axboe unsigned short r[3]; 34f022ddb71f93b5d9e32261491284b9881fceaf0cJens Axboe}; 35f022ddb71f93b5d9e32261491284b9881fceaf0cJens Axboe 363f77f72359e90175d86d549e82c9b2a3488df6dcJens Axboe#ifndef POSIX_MADV_SEQUENTIAL 3708987f0e7f255968ed4780ba3a8ed0cb1bb63904Jens Axboe#define posix_madvise madvise 3808987f0e7f255968ed4780ba3a8ed0cb1bb63904Jens Axboe#define POSIX_MADV_SEQUENTIAL MADV_SEQUENTIAL 393f77f72359e90175d86d549e82c9b2a3488df6dcJens Axboe#define POSIX_MADV_DONTNEED MADV_DONTNEED 4008987f0e7f255968ed4780ba3a8ed0cb1bb63904Jens Axboe#define POSIX_MADV_RANDOM MADV_RANDOM 413f77f72359e90175d86d549e82c9b2a3488df6dcJens Axboe#endif 4208987f0e7f255968ed4780ba3a8ed0cb1bb63904Jens Axboe 4345054cbec0e624de3b79a795d7dfe1c64cdea934Saurabh De#define os_ctime_r(x, y, z) ctime_r((x), (y), (z)) 4445054cbec0e624de3b79a795d7dfe1c64cdea934Saurabh De#define FIO_OS_HAS_CTIME_R 4545054cbec0e624de3b79a795d7dfe1c64cdea934Saurabh De 466f7024e49e41fafcb838acbebf0c31fbcf35132fJens Axboetypedef psetid_t os_cpu_mask_t; 47f022ddb71f93b5d9e32261491284b9881fceaf0cJens Axboetypedef struct solaris_rand_seed os_random_state_t; 482c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboe 4908987f0e7f255968ed4780ba3a8ed0cb1bb63904Jens Axboestatic inline int chardev_size(struct fio_file *f, unsigned long long *bytes) 5008987f0e7f255968ed4780ba3a8ed0cb1bb63904Jens Axboe{ 5108987f0e7f255968ed4780ba3a8ed0cb1bb63904Jens Axboe struct dk_minfo info; 5208987f0e7f255968ed4780ba3a8ed0cb1bb63904Jens Axboe 5308987f0e7f255968ed4780ba3a8ed0cb1bb63904Jens Axboe *bytes = 0; 5408987f0e7f255968ed4780ba3a8ed0cb1bb63904Jens Axboe 5508987f0e7f255968ed4780ba3a8ed0cb1bb63904Jens Axboe if (ioctl(f->fd, DKIOCGMEDIAINFO, &info) < 0) 5608987f0e7f255968ed4780ba3a8ed0cb1bb63904Jens Axboe return errno; 5708987f0e7f255968ed4780ba3a8ed0cb1bb63904Jens Axboe 5808987f0e7f255968ed4780ba3a8ed0cb1bb63904Jens Axboe *bytes = info.dki_lbsize * info.dki_capacity; 5908987f0e7f255968ed4780ba3a8ed0cb1bb63904Jens Axboe return 0; 6008987f0e7f255968ed4780ba3a8ed0cb1bb63904Jens Axboe} 6108987f0e7f255968ed4780ba3a8ed0cb1bb63904Jens Axboe 629b8365618309572d8fd2579c8ea3132db89f843fBruce Cranstatic inline int blockdev_invalidate_cache(struct fio_file *f) 63e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{ 6408987f0e7f255968ed4780ba3a8ed0cb1bb63904Jens Axboe return 0; 652c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboe} 662c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboe 672c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboestatic inline unsigned long long os_phys_mem(void) 682c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboe{ 692c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboe return 0; 702c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboe} 712c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboe 722c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboestatic inline void os_random_seed(unsigned long seed, os_random_state_t *rs) 732c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboe{ 74f022ddb71f93b5d9e32261491284b9881fceaf0cJens Axboe rs->r[0] = seed & 0xffff; 75f022ddb71f93b5d9e32261491284b9881fceaf0cJens Axboe seed >>= 16; 76f022ddb71f93b5d9e32261491284b9881fceaf0cJens Axboe rs->r[1] = seed & 0xffff; 77f022ddb71f93b5d9e32261491284b9881fceaf0cJens Axboe seed >>= 16; 78f022ddb71f93b5d9e32261491284b9881fceaf0cJens Axboe rs->r[2] = seed & 0xffff; 79f022ddb71f93b5d9e32261491284b9881fceaf0cJens Axboe seed48(rs->r); 802c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboe} 812c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboe 822c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboestatic inline long os_random_long(os_random_state_t *rs) 832c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboe{ 84f022ddb71f93b5d9e32261491284b9881fceaf0cJens Axboe return nrand48(rs->r); 852c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboe} 862c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboe 87e116f2b90f110334e77741227ad4e4600302c718Jens Axboe#define FIO_OS_DIRECTIO 88e116f2b90f110334e77741227ad4e4600302c718Jens Axboeextern int directio(int, int); 89e116f2b90f110334e77741227ad4e4600302c718Jens Axboestatic inline int fio_set_odirect(int fd) 90e116f2b90f110334e77741227ad4e4600302c718Jens Axboe{ 91e116f2b90f110334e77741227ad4e4600302c718Jens Axboe if (directio(fd, DIRECTIO_ON) < 0) 92e116f2b90f110334e77741227ad4e4600302c718Jens Axboe return errno; 93e116f2b90f110334e77741227ad4e4600302c718Jens Axboe 94e116f2b90f110334e77741227ad4e4600302c718Jens Axboe return 0; 95e116f2b90f110334e77741227ad4e4600302c718Jens Axboe} 96e116f2b90f110334e77741227ad4e4600302c718Jens Axboe 976f7024e49e41fafcb838acbebf0c31fbcf35132fJens Axboe/* 986f7024e49e41fafcb838acbebf0c31fbcf35132fJens Axboe * pset binding hooks for fio 996f7024e49e41fafcb838acbebf0c31fbcf35132fJens Axboe */ 100e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe#define fio_setaffinity(pid, cpumask) \ 101f2b7ce1c8f2d5ada9b0f789b48b94dc234195fa8Jens Axboe pset_bind((cpumask), P_PID, (pid), NULL) 10239555d0365036f12531f876e6b589a0bce4e5147Jens Axboe#define fio_getaffinity(pid, ptr) ({ 0; }) 1036f7024e49e41fafcb838acbebf0c31fbcf35132fJens Axboe 10439555d0365036f12531f876e6b589a0bce4e5147Jens Axboe#define fio_cpu_clear(mask, cpu) pset_assign(PS_NONE, (cpu), NULL) 10539555d0365036f12531f876e6b589a0bce4e5147Jens Axboe#define fio_cpu_set(mask, cpu) pset_assign(*(mask), (cpu), NULL) 106d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboe 10750b5860bcdc7dfb448c98c913203184e339756d7Jens Axboestatic inline int fio_cpu_isset(os_cpu_mask_t *mask, int cpu) 10850b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe{ 10996ed30cee2c29a61a7c45ab56335ff23d70e377dJens Axboe const unsigned int max_cpus = sysconf(_SC_NPROCESSORS_ONLN); 11096ed30cee2c29a61a7c45ab56335ff23d70e377dJens Axboe unsigned int num_cpus; 11150b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe processorid_t *cpus; 11250b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe int i, ret; 11350b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe 11450b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe cpus = malloc(sizeof(*cpus) * max_cpus); 11550b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe 11650b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe if (pset_info(*mask, NULL, &num_cpus, cpus) < 0) { 11750b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe free(cpus); 11850b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe return 0; 11950b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe } 12050b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe 12150b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe ret = 0; 12296ed30cee2c29a61a7c45ab56335ff23d70e377dJens Axboe for (i = 0; i < num_cpus; i++) { 12350b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe if (cpus[i] == cpu) { 12450b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe ret = 1; 12550b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe break; 12650b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe } 12750b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe } 12850b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe 12950b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe free(cpus); 13050b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe return ret; 13150b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe} 13250b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe 13396ed30cee2c29a61a7c45ab56335ff23d70e377dJens Axboestatic inline int fio_cpu_count(os_cpu_mask_t *mask) 134c2acfbac7e9eb8ac5407ac024c0fd000614c77e2Jens Axboe{ 135c2acfbac7e9eb8ac5407ac024c0fd000614c77e2Jens Axboe unsigned int num_cpus; 136c2acfbac7e9eb8ac5407ac024c0fd000614c77e2Jens Axboe 137c2acfbac7e9eb8ac5407ac024c0fd000614c77e2Jens Axboe if (pset_info(*mask, NULL, &num_cpus, NULL) < 0) 138c2acfbac7e9eb8ac5407ac024c0fd000614c77e2Jens Axboe return 0; 139c2acfbac7e9eb8ac5407ac024c0fd000614c77e2Jens Axboe 140c2acfbac7e9eb8ac5407ac024c0fd000614c77e2Jens Axboe return num_cpus; 141c2acfbac7e9eb8ac5407ac024c0fd000614c77e2Jens Axboe} 142c2acfbac7e9eb8ac5407ac024c0fd000614c77e2Jens Axboe 14396ed30cee2c29a61a7c45ab56335ff23d70e377dJens Axboestatic inline int fio_cpuset_init(os_cpu_mask_t *mask) 14496ed30cee2c29a61a7c45ab56335ff23d70e377dJens Axboe{ 14596ed30cee2c29a61a7c45ab56335ff23d70e377dJens Axboe if (pset_create(mask) < 0) 14696ed30cee2c29a61a7c45ab56335ff23d70e377dJens Axboe return -1; 14796ed30cee2c29a61a7c45ab56335ff23d70e377dJens Axboe 14896ed30cee2c29a61a7c45ab56335ff23d70e377dJens Axboe return 0; 14996ed30cee2c29a61a7c45ab56335ff23d70e377dJens Axboe} 15096ed30cee2c29a61a7c45ab56335ff23d70e377dJens Axboe 151d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboestatic inline int fio_cpuset_exit(os_cpu_mask_t *mask) 152d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboe{ 153e721c57fc77e0155bb73a2c266dba0c6ce0bd3b5Jens Axboe if (pset_destroy(*mask) < 0) 154d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboe return -1; 155d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboe 156d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboe return 0; 157d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboe} 1586f7024e49e41fafcb838acbebf0c31fbcf35132fJens Axboe 159e8d588e4d31f9d1e93b14499d23760d1d3d2db6bJens Axboestatic inline int gettid(void) 160e8d588e4d31f9d1e93b14499d23760d1d3d2db6bJens Axboe{ 161e8d588e4d31f9d1e93b14499d23760d1d3d2db6bJens Axboe return pthread_self(); 162e8d588e4d31f9d1e93b14499d23760d1d3d2db6bJens Axboe} 163e8d588e4d31f9d1e93b14499d23760d1d3d2db6bJens Axboe 1646f7024e49e41fafcb838acbebf0c31fbcf35132fJens Axboe/* 1656f7024e49e41fafcb838acbebf0c31fbcf35132fJens Axboe * Should be enough, not aware of what (if any) restrictions Solaris has 1666f7024e49e41fafcb838acbebf0c31fbcf35132fJens Axboe */ 1676f7024e49e41fafcb838acbebf0c31fbcf35132fJens Axboe#define FIO_MAX_CPUS 16384 1686f7024e49e41fafcb838acbebf0c31fbcf35132fJens Axboe 169a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#ifdef MADV_FREE 170a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#define FIO_MADV_FREE MADV_FREE 171a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#endif 172a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe 1732c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboe#endif 174