1ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#ifndef FIO_OS_FREEBSD_H 2ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define FIO_OS_FREEBSD_H 3ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe 4cca84643cc10cd72b0b453ff92ccb8643ba51493Jens Axboe#define FIO_OS os_freebsd 5cca84643cc10cd72b0b453ff92ccb8643ba51493Jens Axboe 6690dec6e4ec7297a477b809fa24ee23dc02348c9Jens Axboe#include <errno.h> 75c4e1dbc4ec6ee963220c5f4e64a04cd6130dc81Jens Axboe#include <sys/sysctl.h> 8aa5e69b26d16ae4c1680d05b25149f3198036714Jens Axboe#include <sys/disk.h> 9b939683e7b997653a35bd7d55f733fc96030b246Jens Axboe#include <sys/thr.h> 10f1415a9fa9c892b6aa146ef87ca78471bcb57bdbBruce Cran#include <sys/socket.h> 11638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran#include <sys/param.h> 12638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran#include <sys/cpuset.h> 13eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#include <sys/statvfs.h> 145c4e1dbc4ec6ee963220c5f4e64a04cd6130dc81Jens Axboe 15e2e58886427019b525d2a234c5404a38ec0c7ebfJens Axboe#include "../file.h" 16e2e58886427019b525d2a234c5404a38ec0c7ebfJens Axboe 172c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboe#define FIO_HAVE_ODIRECT 18535313705d69dc16f27ca38acf2f9bf7205e410dJens Axboe#define FIO_USE_GENERIC_RAND 1993bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define FIO_USE_GENERIC_INIT_RANDOM_STATE 204ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe#define FIO_HAVE_CHARDEV_SIZE 21eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#define FIO_HAVE_FS_STAT 22eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#define FIO_HAVE_TRIM 23e8d588e4d31f9d1e93b14499d23760d1d3d2db6bJens Axboe#define FIO_HAVE_GETTID 24638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran#define FIO_HAVE_CPU_AFFINITY 25eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes#define FIO_HAVE_SHM_ATTACH_REMOVED 26ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe 27dc873b6f4a536c332b72cce268d5a7ccd356a891Jens Axboe#define OS_MAP_ANON MAP_ANON 28ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe 29232f9b73353e0322fe135d3029beecedaed7a17bJens Axboe#define fio_swap16(x) bswap16(x) 30232f9b73353e0322fe135d3029beecedaed7a17bJens Axboe#define fio_swap32(x) bswap32(x) 31232f9b73353e0322fe135d3029beecedaed7a17bJens Axboe#define fio_swap64(x) bswap64(x) 32232f9b73353e0322fe135d3029beecedaed7a17bJens Axboe 33907249cffbdfa26de688c127abb5483154a4eae6Jens Axboetypedef off_t off64_t; 34907249cffbdfa26de688c127abb5483154a4eae6Jens Axboe 35638204956e6ef8f79033163667bdda94aaf9e949Bruce Crantypedef cpuset_t os_cpu_mask_t; 36638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran 37638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran#define fio_cpu_clear(mask, cpu) (void) CPU_CLR((cpu), (mask)) 38638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran#define fio_cpu_set(mask, cpu) (void) CPU_SET((cpu), (mask)) 3950b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe#define fio_cpu_isset(mask, cpu) CPU_ISSET((cpu), (mask)) 40d004a209eee0a8db603c2d7ca6dc5fb6c367aa5aJens Axboe#define fio_cpu_count(mask) CPU_COUNT((mask)) 41638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran 42638204956e6ef8f79033163667bdda94aaf9e949Bruce Cranstatic inline int fio_cpuset_init(os_cpu_mask_t *mask) 43638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran{ 44638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran CPU_ZERO(mask); 45638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran return 0; 46638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran} 47638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran 48638204956e6ef8f79033163667bdda94aaf9e949Bruce Cranstatic inline int fio_cpuset_exit(os_cpu_mask_t *mask) 49638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran{ 50638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran return 0; 51638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran} 52638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran 53638204956e6ef8f79033163667bdda94aaf9e949Bruce Cranstatic inline int fio_setaffinity(int pid, os_cpu_mask_t cpumask) 54638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran{ 55638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran return cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID, pid, sizeof(cpumask), &cpumask); 56638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran} 57638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran 58638204956e6ef8f79033163667bdda94aaf9e949Bruce Cranstatic inline int fio_getaffinity(int pid, os_cpu_mask_t *cpumask) 59638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran{ 60638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran return cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_PID, pid, sizeof(cpumask), cpumask); 61638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran} 62638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran 63638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran#define FIO_MAX_CPUS CPU_SETSIZE 64638204956e6ef8f79033163667bdda94aaf9e949Bruce Cran 65ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cranstatic inline int blockdev_size(struct fio_file *f, unsigned long long *bytes) 66aa5e69b26d16ae4c1680d05b25149f3198036714Jens Axboe{ 67aa5e69b26d16ae4c1680d05b25149f3198036714Jens Axboe off_t size; 68aa5e69b26d16ae4c1680d05b25149f3198036714Jens Axboe 69ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran if (!ioctl(f->fd, DIOCGMEDIASIZE, &size)) { 70aa5e69b26d16ae4c1680d05b25149f3198036714Jens Axboe *bytes = size; 71aa5e69b26d16ae4c1680d05b25149f3198036714Jens Axboe return 0; 72aa5e69b26d16ae4c1680d05b25149f3198036714Jens Axboe } 73aa5e69b26d16ae4c1680d05b25149f3198036714Jens Axboe 742fa55e93d8895e0645df3e50baae82d15d9beea4Jens Axboe *bytes = 0; 75aa5e69b26d16ae4c1680d05b25149f3198036714Jens Axboe return errno; 76aa5e69b26d16ae4c1680d05b25149f3198036714Jens Axboe} 77aa5e69b26d16ae4c1680d05b25149f3198036714Jens Axboe 78ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cranstatic inline int chardev_size(struct fio_file *f, unsigned long long *bytes) 794ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe{ 809b8365618309572d8fd2579c8ea3132db89f843fBruce Cran return blockdev_size(f, bytes); 814ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe} 824ccdccd149d82c94ec6ccdb4118d9e27479b8516Jens Axboe 83ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cranstatic inline int blockdev_invalidate_cache(struct fio_file *f) 84e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{ 85eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return ENOTSUP; 86ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe} 87ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe 8832cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboestatic inline unsigned long long os_phys_mem(void) 8932cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe{ 9032cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe int mib[2] = { CTL_HW, HW_PHYSMEM }; 9132cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe unsigned long long mem; 9232cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe size_t len = sizeof(mem); 9332cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe 9432cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe sysctl(mib, 2, &mem, &len, NULL, 0); 9532cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe return mem; 9632cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe} 9732cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe 98e8d588e4d31f9d1e93b14499d23760d1d3d2db6bJens Axboestatic inline int gettid(void) 99e8d588e4d31f9d1e93b14499d23760d1d3d2db6bJens Axboe{ 100e8d588e4d31f9d1e93b14499d23760d1d3d2db6bJens Axboe long lwpid; 101e8d588e4d31f9d1e93b14499d23760d1d3d2db6bJens Axboe 102e8d588e4d31f9d1e93b14499d23760d1d3d2db6bJens Axboe thr_self(&lwpid); 103e8d588e4d31f9d1e93b14499d23760d1d3d2db6bJens Axboe return (int) lwpid; 104e8d588e4d31f9d1e93b14499d23760d1d3d2db6bJens Axboe} 105e8d588e4d31f9d1e93b14499d23760d1d3d2db6bJens Axboe 106eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesstatic inline unsigned long long get_fs_free_size(const char *path) 107eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes{ 108eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes unsigned long long ret; 109eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes struct statvfs s; 110eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 111eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (statvfs(path, &s) < 0) 112eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return -1ULL; 113eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 114eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes ret = s.f_frsize; 115eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes ret *= (unsigned long long) s.f_bfree; 116eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return ret; 117eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes} 118eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 119eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesstatic inline int os_trim(int fd, unsigned long long start, 120eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes unsigned long long len) 121eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes{ 122eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes off_t range[2]; 123eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 124eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes range[0] = start; 125eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes range[1] = len; 126eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 127eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (!ioctl(fd, DIOCGDELETE, range)) 128eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return 0; 129eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 130eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return errno; 131eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes} 132eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 133a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#ifdef MADV_FREE 134a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#define FIO_MADV_FREE MADV_FREE 135a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#endif 136a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe 137eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesstatic inline int shm_attach_to_open_removed(void) 138eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes{ 139eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes int x; 140eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes size_t len = sizeof(x); 141eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 142eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes if (sysctlbyname("kern.ipc.shm_allow_removed", &x, &len, NULL, 0) < 0) 143eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return 0; 144eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 145eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes return x > 0 ? 1 : 0; 146eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes} 147eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes 148ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#endif 149