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