193bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#ifndef FIO_OS_WINDOWS_H 293bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define FIO_OS_WINDOWS_H 393bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 493bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define FIO_OS os_windows 593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#include <sys/types.h> 793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#include <sys/shm.h> 893bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#include <sys/stat.h> 993bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#include <errno.h> 105aa23eb8d6ae67c5a5e31737164307675b36518eBruce Cran#include <winsock2.h> 1193bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#include <windows.h> 1293bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#include <psapi.h> 1393bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#include <stdlib.h> 1493bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 1593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#include "../smalloc.h" 1693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#include "../file.h" 1793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#include "../log.h" 1895db3079d0c9060f0fc31d5425bcd7d67076523bJens Axboe#include "../lib/hweight.h" 1993bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 201f81991ed356dd7257aef2c715ba9a24d9af93a5Jens Axboe#include "windows/posix.h" 211f81991ed356dd7257aef2c715ba9a24d9af93a5Jens Axboe 22f16b7405fff7c3fc1da421b6bdf8552cc99c3156Bruce Cran#ifndef PTHREAD_STACK_MIN 23f16b7405fff7c3fc1da421b6bdf8552cc99c3156Bruce Cran#define PTHREAD_STACK_MIN 65535 24f16b7405fff7c3fc1da421b6bdf8552cc99c3156Bruce Cran#endif 25f16b7405fff7c3fc1da421b6bdf8552cc99c3156Bruce Cran 2693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define FIO_HAVE_ODIRECT 2793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define FIO_HAVE_CPU_AFFINITY 2893bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define FIO_HAVE_CHARDEV_SIZE 2993bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define FIO_HAVE_GETTID 3093bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define FIO_USE_GENERIC_RAND 3193bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 3293bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define FIO_PREFERRED_ENGINE "windowsaio" 3393bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define FIO_PREFERRED_CLOCK_SOURCE CS_CGETTIME 3493bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define FIO_OS_PATH_SEPARATOR "\\" 3593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 3693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define FIO_MAX_CPUS MAXIMUM_PROCESSORS 3793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 3893bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define OS_MAP_ANON MAP_ANON 3993bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 4093bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define fio_swap16(x) _byteswap_ushort(x) 4193bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define fio_swap32(x) _byteswap_ulong(x) 4293bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define fio_swap64(x) _byteswap_uint64(x) 4393bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 4493bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Crantypedef DWORD_PTR os_cpu_mask_t; 4593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 4693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define _SC_PAGESIZE 0x1 4793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define _SC_NPROCESSORS_ONLN 0x2 4893bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define _SC_PHYS_PAGES 0x4 4993bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 5093bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define SA_RESTART 0 5193bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define SIGPIPE 0 5293bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 5393bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran/* 5493bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran * Windows doesn't have O_DIRECT or O_SYNC, so define them 5593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran * here so we can reject them at runtime when using the _open 5693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran * interface (windowsaio uses CreateFile) 5793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran */ 5893bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define O_DIRECT 0x1000000 5993bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define O_SYNC 0x2000000 6093bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 6193bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran/* Windows doesn't support madvise, so any values will work */ 6293bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define POSIX_MADV_DONTNEED 0 6393bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define POSIX_MADV_SEQUENTIAL 0 6493bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define POSIX_MADV_RANDOM 0 6593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 6693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define F_SETFL 0x1 6793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define F_GETFL 0x2 6893bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define O_NONBLOCK FIONBIO 6993bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 7093bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran/* Winsock doesn't support MSG_WAIT */ 7193bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define OS_MSG_DONTWAIT 0 7293bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 7393bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define POLLOUT 1 7493bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define POLLIN 2 7593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define POLLERR 0 7693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define POLLHUP 1 7793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 7893bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define SIGCONT 0 7984306c1d9ecd94e93436da62b41ef61ac6e281acBruce Cran#define SIGUSR1 1 802277d5d5ec39cbd06430348780b1ceb7d01710aeBruce Cran#define SIGUSR2 2 8193bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 8293bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Crantypedef int sigset_t; 8393bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Crantypedef int siginfo_t; 8493bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 8593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranstruct sigaction 8693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran{ 8793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran void (*sa_handler)(int); 8893bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran sigset_t sa_mask; 8993bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran int sa_flags; 9093bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran void* (*sa_sigaction)(int, siginfo_t *, void*); 9193bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran}; 9293bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 9393bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranlong sysconf(int name); 9493bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 9593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranint kill(pid_t pid, int sig); 9693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranpid_t setsid(void); 9793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranint setgid(gid_t gid); 9893bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranint setuid(uid_t uid); 9993bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranint nice(int incr); 10093bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranint sigaction(int sig, const struct sigaction *act, 10193bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran struct sigaction *oact); 10293bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranint fsync(int fildes); 10393bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranint fork(void); 10493bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranint fcntl(int fildes, int cmd, ...); 10593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranint fdatasync(int fildes); 10693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranint lstat(const char * path, struct stat * buf); 10793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranuid_t geteuid(void); 10893bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranint nanosleep(const struct timespec *rqtp, struct timespec *rmtp); 10993bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset); 11093bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranssize_t pwrite(int fildes, const void *buf, size_t nbyte, 11193bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran off_t offset); 11293bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranextern void td_fill_rand_seeds(struct thread_data *); 11393bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 11493bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranstatic inline int blockdev_size(struct fio_file *f, unsigned long long *bytes) 11593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran{ 11693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran int rc = 0; 11793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran HANDLE hFile; 1185aa23eb8d6ae67c5a5e31737164307675b36518eBruce Cran GET_LENGTH_INFORMATION info; 1195aa23eb8d6ae67c5a5e31737164307675b36518eBruce Cran DWORD outBytes; 12093bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 12193bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran if (f->hFile == NULL) { 12293bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran hFile = CreateFile(f->file_name, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 12393bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran NULL, OPEN_EXISTING, 0, NULL); 12493bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran } else { 12593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran hFile = f->hFile; 12693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran } 12793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 12893bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran if (DeviceIoControl(hFile, IOCTL_DISK_GET_LENGTH_INFO, NULL, 0, &info, sizeof(info), &outBytes, NULL)) 12993bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran *bytes = info.Length.QuadPart; 13093bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran else 13193bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran rc = EIO; 13293bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 13393bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran /* If we were passed a POSIX fd, 13493bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran * close the HANDLE we created via CreateFile */ 13593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran if (hFile != INVALID_HANDLE_VALUE && f->hFile == NULL) 13693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran CloseHandle(hFile); 13793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 13893bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran return rc; 13993bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran} 14093bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 14193bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranstatic inline int chardev_size(struct fio_file *f, unsigned long long *bytes) 14293bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran{ 14393bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran return blockdev_size(f, bytes); 14493bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran} 14593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 14693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranstatic inline int blockdev_invalidate_cache(struct fio_file *f) 14793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran{ 14893bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran /* There's no way to invalidate the cache in Windows 14993bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran * so just pretend to succeed */ 15093bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran return 0; 15193bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran} 15293bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 15393bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranstatic inline unsigned long long os_phys_mem(void) 15493bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran{ 15501d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran long pagesize, pages; 15693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 15701d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran pagesize = sysconf(_SC_PAGESIZE); 15801d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran pages = sysconf(_SC_PHYS_PAGES); 15901d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran if (pages == -1 || pagesize == -1) 16001d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran return 0; 16101d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran 16201d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran return (unsigned long long) pages * (unsigned long long) pagesize; 16393bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran} 16493bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 16593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranstatic inline int gettid(void) 16693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran{ 16793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran return GetCurrentThreadId(); 16893bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran} 16993bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 17093bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranstatic inline int fio_setaffinity(int pid, os_cpu_mask_t cpumask) 17193bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran{ 17293bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran HANDLE h; 17393bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran BOOL bSuccess = FALSE; 17493bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 17593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran h = OpenThread(THREAD_QUERY_INFORMATION | THREAD_SET_INFORMATION, TRUE, pid); 17693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran if (h != NULL) { 17793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran bSuccess = SetThreadAffinityMask(h, cpumask); 1783cf1ff44af1a1cc17354ce495647448e1e4924e2Bruce Cran if (!bSuccess) 1793cf1ff44af1a1cc17354ce495647448e1e4924e2Bruce Cran log_err("fio_setaffinity failed: failed to set thread affinity (pid %d, mask %.16llx)\n", pid, cpumask); 1803cf1ff44af1a1cc17354ce495647448e1e4924e2Bruce Cran 18193bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran CloseHandle(h); 1823cf1ff44af1a1cc17354ce495647448e1e4924e2Bruce Cran } else { 1833cf1ff44af1a1cc17354ce495647448e1e4924e2Bruce Cran log_err("fio_setaffinity failed: failed to get handle for pid %d\n", pid); 18493bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran } 18593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 18693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran return (bSuccess)? 0 : -1; 18793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran} 18893bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 18993bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranstatic inline void fio_getaffinity(int pid, os_cpu_mask_t *mask) 19093bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran{ 19193bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran os_cpu_mask_t systemMask; 19293bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 19393bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION, TRUE, pid); 19493bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 19593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran if (h != NULL) { 19693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran GetProcessAffinityMask(h, mask, &systemMask); 19793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran CloseHandle(h); 19893bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran } else { 19993bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran log_err("fio_getaffinity failed: failed to get handle for pid %d\n", pid); 20093bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran } 20193bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran} 20293bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 20393bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranstatic inline void fio_cpu_clear(os_cpu_mask_t *mask, int cpu) 20493bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran{ 20593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran *mask ^= 1 << (cpu-1); 20693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran} 20793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 20893bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranstatic inline void fio_cpu_set(os_cpu_mask_t *mask, int cpu) 20993bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran{ 2103cf1ff44af1a1cc17354ce495647448e1e4924e2Bruce Cran *mask |= 1 << cpu; 21193bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran} 21293bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 21350b5860bcdc7dfb448c98c913203184e339756d7Jens Axboestatic inline int fio_cpu_isset(os_cpu_mask_t *mask, int cpu) 21450b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe{ 21550b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe return (*mask & (1U << cpu)); 21650b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe} 21750b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe 218a1fc70fbb0497a4e0dc061bd8fc35c8d4d29d2ddJens Axboestatic inline int fio_cpu_count(os_cpu_mask_t *mask) 219c2acfbac7e9eb8ac5407ac024c0fd000614c77e2Jens Axboe{ 220c2acfbac7e9eb8ac5407ac024c0fd000614c77e2Jens Axboe return hweight64(*mask); 221c2acfbac7e9eb8ac5407ac024c0fd000614c77e2Jens Axboe} 222c2acfbac7e9eb8ac5407ac024c0fd000614c77e2Jens Axboe 22393bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranstatic inline int fio_cpuset_init(os_cpu_mask_t *mask) 22493bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran{ 22593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran *mask = 0; 22693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran return 0; 22793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran} 22893bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 22993bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranstatic inline int fio_cpuset_exit(os_cpu_mask_t *mask) 23093bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran{ 23193bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran return 0; 23293bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran} 23393bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 23493bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cranstatic inline int init_random_state(struct thread_data *td, unsigned long *rand_seeds, int size) 23593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran{ 23693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran HCRYPTPROV hCryptProv; 23793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 23893bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran if (!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) 23993bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran { 24093bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran errno = GetLastError(); 24193bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran log_err("CryptAcquireContext() failed: error %d\n", errno); 24293bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran return 1; 24393bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran } 24493bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 24593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran if (!CryptGenRandom(hCryptProv, size, (BYTE*)rand_seeds)) { 24693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran errno = GetLastError(); 24793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran log_err("CryptGenRandom() failed, error %d\n", errno); 24893bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran CryptReleaseContext(hCryptProv, 0); 24993bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran return 1; 25093bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran } 25193bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 25293bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran CryptReleaseContext(hCryptProv, 0); 25393bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran td_fill_rand_seeds(td); 25493bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran return 0; 25593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran} 25693bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 25793bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran 258f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liustatic inline int fio_set_sched_idle(void) 259f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liu{ 260f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liu /* SetThreadPriority returns nonzero for success */ 261f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liu return (SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_IDLE))? 0 : -1; 262f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liu} 263f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liu 264f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liu 26593bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#endif /* FIO_OS_WINDOWS_H */ 266