1ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#ifndef FIO_OS_LINUX_H 2ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define FIO_OS_LINUX_H 3ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe 4cca84643cc10cd72b0b453ff92ccb8643ba51493Jens Axboe#define FIO_OS os_linux 5cca84643cc10cd72b0b453ff92ccb8643ba51493Jens Axboe 6ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#include <sys/ioctl.h> 78756e4d421722eaeb089067aeaaf317d05d53a57Jens Axboe#include <sys/uio.h> 83c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe#include <sys/syscall.h> 92e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe#include <sys/vfs.h> 1039b9356872f27c1a48a2ab09a5252dffd1de22d2Jens Axboe#include <sys/mman.h> 113c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe#include <unistd.h> 1297fbdfa1a48a6b535d420e3f53bcb62ed4eff3f1Jens Axboe#include <fcntl.h> 133c2d93ede7d03b3a6923edb55c7737fe014794cbJens Axboe#include <errno.h> 14d09913c248f04ab33a7e7bbfb2227e9db8b9f4a2Jens Axboe#include <sched.h> 15ea421790658582e392c5bb562ff461f8f5c71844Jens Axboe#include <linux/unistd.h> 1607e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe#include <linux/raw.h> 1707e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe#include <linux/major.h> 18ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe 1979a43187163eb99eaabaa496cb8b5e3a164f3e09Jens Axboe#include "binject.h" 20e2e58886427019b525d2a234c5404a38ec0c7ebfJens Axboe#include "../file.h" 21f3de88a7a8806016ebb27af3f4be1fced172122eJens Axboe 22ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define FIO_HAVE_CPU_AFFINITY 23ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define FIO_HAVE_DISK_UTIL 24ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define FIO_HAVE_SGIO 25ba4f8923a7d7b02e69f6daee8dee5ed6e44722ceJens Axboe#define FIO_HAVE_IOPRIO 2622f78b320a8d2ffa32b5736fe754c108a8d21525Jens Axboe#define FIO_HAVE_IOSCHED_SWITCH 272c0ecd28459b6a1b236c865defb5ef76ce8bfa02Jens Axboe#define FIO_HAVE_ODIRECT 2874b025b071b5bfbffa7ad7682b66b749e8d1f955Jens Axboe#define FIO_HAVE_HUGETLB 2907e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe#define FIO_HAVE_RAWBIND 305e62c22a669c7a8c03b7871852cf85ad6d355980Jens Axboe#define FIO_HAVE_BLKTRACE 31f356d01d0cf8fec2ee58f66a9b5c00c93defbc47Jens Axboe#define FIO_HAVE_PSHARED_MUTEX 32eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe#define FIO_HAVE_CL_SIZE 33a696fa2a9c2e21a1c88813235d6fc39d267f6155Jens Axboe#define FIO_HAVE_CGROUPS 342e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe#define FIO_HAVE_FS_STAT 35a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe#define FIO_HAVE_TRIM 3679a43187163eb99eaabaa496cb8b5e3a164f3e09Jens Axboe#define FIO_HAVE_BINJECT 3747f767c113be7448eb8aa9d4a9f9aa8f760ef642Jens Axboe#define FIO_HAVE_GETTID 3893bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran#define FIO_USE_GENERIC_INIT_RANDOM_STATE 39b6959b55efa7f464dbb7e7f2021dd67d297219bdJens Axboe 4039b9356872f27c1a48a2ab09a5252dffd1de22d2Jens Axboe#ifdef MAP_HUGETLB 4139b9356872f27c1a48a2ab09a5252dffd1de22d2Jens Axboe#define FIO_HAVE_MMAP_HUGE 4239b9356872f27c1a48a2ab09a5252dffd1de22d2Jens Axboe#endif 4339b9356872f27c1a48a2ab09a5252dffd1de22d2Jens Axboe 44dc873b6f4a536c332b72cce268d5a7ccd356a891Jens Axboe#define OS_MAP_ANON MAP_ANONYMOUS 45ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe 46ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboetypedef cpu_set_t os_cpu_mask_t; 474e78e405a12b31291aa88fffc1da2cf43b782ef5Jens Axboe 486dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboetypedef struct drand48_data os_random_state_t; 49ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe 5067bf982340d95ca98098ea050b54b4c7adb116c0Jens Axboe#ifdef CONFIG_3ARG_AFFINITY 51e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe#define fio_setaffinity(pid, cpumask) \ 52e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe sched_setaffinity((pid), sizeof(cpumask), &(cpumask)) 53ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define fio_getaffinity(pid, ptr) \ 54ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe sched_getaffinity((pid), sizeof(cpu_set_t), (ptr)) 5567bf982340d95ca98098ea050b54b4c7adb116c0Jens Axboe#elif defined(CONFIG_2ARG_AFFINITY) 56e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe#define fio_setaffinity(pid, cpumask) \ 57e8462bd8250cf3ff2d41f17e1a4d4cefc70b6b37Jens Axboe sched_setaffinity((pid), &(cpumask)) 58c8f025f8a33e05b10fe928d5899ac4e948847eb6Jens Axboe#define fio_getaffinity(pid, ptr) \ 59c8f025f8a33e05b10fe928d5899ac4e948847eb6Jens Axboe sched_getaffinity((pid), (ptr)) 60c8f025f8a33e05b10fe928d5899ac4e948847eb6Jens Axboe#endif 61be4ecfdf6c8daa75c4df8ac875c9a87da80d81a0Jens Axboe 621f4c0a4f558557d45e6b186033577ec0b16872e5Jens Axboe#define fio_cpu_clear(mask, cpu) (void) CPU_CLR((cpu), (mask)) 631f4c0a4f558557d45e6b186033577ec0b16872e5Jens Axboe#define fio_cpu_set(mask, cpu) (void) CPU_SET((cpu), (mask)) 6450b5860bcdc7dfb448c98c913203184e339756d7Jens Axboe#define fio_cpu_isset(mask, cpu) CPU_ISSET((cpu), (mask)) 65d004a209eee0a8db603c2d7ca6dc5fb6c367aa5aJens Axboe#define fio_cpu_count(mask) CPU_COUNT((mask)) 66d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboe 67d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboestatic inline int fio_cpuset_init(os_cpu_mask_t *mask) 68d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboe{ 69d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboe CPU_ZERO(mask); 70d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboe return 0; 71d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboe} 72d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboe 73d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboestatic inline int fio_cpuset_exit(os_cpu_mask_t *mask) 74d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboe{ 75d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboe return 0; 76d2ce18b5dfdc1736a99b4e2d731119cc4880e197Jens Axboe} 776d459ee7e90393af490a64709aec206d8a585ebdJens Axboe 786d459ee7e90393af490a64709aec206d8a585ebdJens Axboe#define FIO_MAX_CPUS CPU_SETSIZE 794d8947de2b50578a4f6290be567cb5de5bf46776Shawn Lewis 8028727df79348d4ebbd8fd4b0dd89bbca035f68d0Jens Axboeenum { 8128727df79348d4ebbd8fd4b0dd89bbca035f68d0Jens Axboe IOPRIO_CLASS_NONE, 8228727df79348d4ebbd8fd4b0dd89bbca035f68d0Jens Axboe IOPRIO_CLASS_RT, 8328727df79348d4ebbd8fd4b0dd89bbca035f68d0Jens Axboe IOPRIO_CLASS_BE, 8428727df79348d4ebbd8fd4b0dd89bbca035f68d0Jens Axboe IOPRIO_CLASS_IDLE, 8528727df79348d4ebbd8fd4b0dd89bbca035f68d0Jens Axboe}; 8628727df79348d4ebbd8fd4b0dd89bbca035f68d0Jens Axboe 8728727df79348d4ebbd8fd4b0dd89bbca035f68d0Jens Axboeenum { 8828727df79348d4ebbd8fd4b0dd89bbca035f68d0Jens Axboe IOPRIO_WHO_PROCESS = 1, 8928727df79348d4ebbd8fd4b0dd89bbca035f68d0Jens Axboe IOPRIO_WHO_PGRP, 9028727df79348d4ebbd8fd4b0dd89bbca035f68d0Jens Axboe IOPRIO_WHO_USER, 9128727df79348d4ebbd8fd4b0dd89bbca035f68d0Jens Axboe}; 9228727df79348d4ebbd8fd4b0dd89bbca035f68d0Jens Axboe 9328727df79348d4ebbd8fd4b0dd89bbca035f68d0Jens Axboe#define IOPRIO_BITS 16 9428727df79348d4ebbd8fd4b0dd89bbca035f68d0Jens Axboe#define IOPRIO_CLASS_SHIFT 13 9528727df79348d4ebbd8fd4b0dd89bbca035f68d0Jens Axboe 9628727df79348d4ebbd8fd4b0dd89bbca035f68d0Jens Axboestatic inline int ioprio_set(int which, int who, int ioprio_class, int ioprio) 97ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{ 9828727df79348d4ebbd8fd4b0dd89bbca035f68d0Jens Axboe /* 9928727df79348d4ebbd8fd4b0dd89bbca035f68d0Jens Axboe * If no class is set, assume BE 10028727df79348d4ebbd8fd4b0dd89bbca035f68d0Jens Axboe */ 10128727df79348d4ebbd8fd4b0dd89bbca035f68d0Jens Axboe if (!ioprio_class) 10228727df79348d4ebbd8fd4b0dd89bbca035f68d0Jens Axboe ioprio_class = IOPRIO_CLASS_BE; 10328727df79348d4ebbd8fd4b0dd89bbca035f68d0Jens Axboe 10428727df79348d4ebbd8fd4b0dd89bbca035f68d0Jens Axboe ioprio |= ioprio_class << IOPRIO_CLASS_SHIFT; 105ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe return syscall(__NR_ioprio_set, which, who, ioprio); 106ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe} 107ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe 10847f767c113be7448eb8aa9d4a9f9aa8f760ef642Jens Axboestatic inline int gettid(void) 10947f767c113be7448eb8aa9d4a9f9aa8f760ef642Jens Axboe{ 11047f767c113be7448eb8aa9d4a9f9aa8f760ef642Jens Axboe return syscall(__NR_gettid); 11147f767c113be7448eb8aa9d4a9f9aa8f760ef642Jens Axboe} 11247f767c113be7448eb8aa9d4a9f9aa8f760ef642Jens Axboe 1133feedc608f168479bde2f2e079cedd6852cb3b3bJens Axboe#define SPLICE_DEF_SIZE (64*1024) 1143feedc608f168479bde2f2e079cedd6852cb3b3bJens Axboe 115ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#ifndef BLKGETSIZE64 116ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#define BLKGETSIZE64 _IOR(0x12,114,size_t) 117ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#endif 118ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe 119e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe#ifndef BLKFLSBUF 120e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe#define BLKFLSBUF _IO(0x12,97) 121e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe#endif 122e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 123a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe#ifndef BLKDISCARD 124a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe#define BLKDISCARD _IO(0x12,119) 125a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe#endif 126a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe 127e2e58886427019b525d2a234c5404a38ec0c7ebfJens Axboestatic inline int blockdev_invalidate_cache(struct fio_file *f) 128e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe{ 129ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran return ioctl(f->fd, BLKFLSBUF); 130e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe} 131e5b401d4bf67a1704f28872d3abe09eaf65cdabeJens Axboe 132ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cranstatic inline int blockdev_size(struct fio_file *f, unsigned long long *bytes) 133ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe{ 134ecc314ba7c5f02b7e90ac1dfbce1a74cd4e6d6feBruce Cran if (!ioctl(f->fd, BLKGETSIZE64, bytes)) 135ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe return 0; 136ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe 137ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe return errno; 138ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe} 139ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe 14032cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboestatic inline unsigned long long os_phys_mem(void) 14132cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe{ 14232cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe long pagesize, pages; 14332cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe 14432cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe pagesize = sysconf(_SC_PAGESIZE); 14532cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe pages = sysconf(_SC_PHYS_PAGES); 14632cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe if (pages == -1 || pagesize == -1) 14732cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe return 0; 14832cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe 14932cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe return (unsigned long long) pages * (unsigned long long) pagesize; 15032cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe} 15132cd46a085ac60f4f8b085e2d65ebfc6100bb8c5Jens Axboe 1526dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboestatic inline void os_random_seed(unsigned long seed, os_random_state_t *rs) 1536dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe{ 1546dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe srand48_r(seed, rs); 1556dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe} 1566dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe 1576dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboestatic inline long os_random_long(os_random_state_t *rs) 1586dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe{ 1596dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe long val; 1606dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe 1616dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe lrand48_r(rs, &val); 1626dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe return val; 1636dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe} 1646dfd46b99af38cc1e5f702f53c59212129fe615eJens Axboe 1658cc7afa91ddc5a0980b9d2dbfdd66e1511a0d4b1Jens Axboestatic inline int fio_lookup_raw(dev_t dev, int *majdev, int *mindev) 16607e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe{ 16707e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe struct raw_config_request rq; 16807e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe int fd; 16907e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe 17007e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe if (major(dev) != RAW_MAJOR) 1718cc7afa91ddc5a0980b9d2dbfdd66e1511a0d4b1Jens Axboe return 1; 17207e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe 17307e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe /* 17407e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe * we should be able to find /dev/rawctl or /dev/raw/rawctl 17507e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe */ 17607e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe fd = open("/dev/rawctl", O_RDONLY); 17707e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe if (fd < 0) { 17807e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe fd = open("/dev/raw/rawctl", O_RDONLY); 17907e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe if (fd < 0) 1808cc7afa91ddc5a0980b9d2dbfdd66e1511a0d4b1Jens Axboe return 1; 18107e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe } 18207e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe 18307e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe rq.raw_minor = minor(dev); 18407e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe if (ioctl(fd, RAW_GETBIND, &rq) < 0) { 18507e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe close(fd); 1868cc7afa91ddc5a0980b9d2dbfdd66e1511a0d4b1Jens Axboe return 1; 18707e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe } 18807e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe 18907e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe close(fd); 19007e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe *majdev = rq.block_major; 19107e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe *mindev = rq.block_minor; 1928cc7afa91ddc5a0980b9d2dbfdd66e1511a0d4b1Jens Axboe return 0; 19307e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe} 19407e5b2646f673a56c05a53c6a84bf5d0c949d290Jens Axboe 1955b6f5c6609c530943310754028d2628d984b6595Jens Axboe#ifdef O_NOATIME 1965921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe#define FIO_O_NOATIME O_NOATIME 1975b6f5c6609c530943310754028d2628d984b6595Jens Axboe#else 1985b6f5c6609c530943310754028d2628d984b6595Jens Axboe#define FIO_O_NOATIME 0 1995b6f5c6609c530943310754028d2628d984b6595Jens Axboe#endif 2005921e80c5dfc9f96d2f21da6ae58f2b5d3a0b373Jens Axboe 201d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason#ifdef O_ATOMIC 202d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason#define OS_O_ATOMIC O_ATOMIC 203d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason#else 204d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason#define OS_O_ATOMIC 040000000 205d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason#endif 206d01612f3ae2515eb035d0c4ce954d8cb167a0a61Chris Mason 207a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#ifdef MADV_REMOVE 208a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#define FIO_MADV_FREE MADV_REMOVE 209a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe#endif 210a1c58075279454a91ec43366846b93e8dcf9753cJens Axboe 211ff2451922f21826c2047208c2c3963843b1ffdccJens Axboe#define fio_swap16(x) __bswap_16(x) 212ff2451922f21826c2047208c2c3963843b1ffdccJens Axboe#define fio_swap32(x) __bswap_32(x) 213ff2451922f21826c2047208c2c3963843b1ffdccJens Axboe#define fio_swap64(x) __bswap_64(x) 214ff2451922f21826c2047208c2c3963843b1ffdccJens Axboe 215eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe#define CACHE_LINE_FILE \ 216eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe "/sys/devices/system/cpu/cpu0/cache/index0/coherency_line_size" 217eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe 218eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboestatic inline int arch_cache_line_size(void) 219eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe{ 220eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe char size[32]; 221eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe int fd, ret; 222eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe 223eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe fd = open(CACHE_LINE_FILE, O_RDONLY); 224eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe if (fd < 0) 225eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe return -1; 226eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe 227eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe ret = read(fd, size, sizeof(size)); 228ec76f15a4ae995c06db6c6dda6a6fa41b189f613Jens Axboe 229ec76f15a4ae995c06db6c6dda6a6fa41b189f613Jens Axboe close(fd); 230ec76f15a4ae995c06db6c6dda6a6fa41b189f613Jens Axboe 231eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe if (ret <= 0) 232eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe return -1; 233ec76f15a4ae995c06db6c6dda6a6fa41b189f613Jens Axboe else 234ec76f15a4ae995c06db6c6dda6a6fa41b189f613Jens Axboe return atoi(size); 235eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe} 236eb7ccf38bf2e9208b593d021c50e9ad2ec0781eaJens Axboe 2372e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboestatic inline unsigned long long get_fs_size(const char *path) 2382e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe{ 2392e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe unsigned long long ret; 2402e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe struct statfs s; 2412e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 2422e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe if (statfs(path, &s) < 0) 2432e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe return -1ULL; 2442e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 2452e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe ret = s.f_bsize; 2462e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe ret *= (unsigned long long) s.f_bfree; 2472e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe return ret; 2482e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe} 2492e3bd4c21cc239fbda992a4ede89ebb85f550920Jens Axboe 250a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboestatic inline int os_trim(int fd, unsigned long long start, 251a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe unsigned long long len) 252a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe{ 253a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe uint64_t range[2]; 254a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe 255a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe range[0] = start; 256a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe range[1] = len; 257a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe 258a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe if (!ioctl(fd, BLKDISCARD, range)) 259a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe return 0; 260a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe 261a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe return errno; 262a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe} 263a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboe 2647e09a9f10bb301635b6f9206b3144878a2710b0aJens Axboe#ifdef CONFIG_SCHED_IDLE 265f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liustatic inline int fio_set_sched_idle(void) 266f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liu{ 267f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liu struct sched_param p = { .sched_priority = 0, }; 268f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liu return sched_setscheduler(gettid(), SCHED_IDLE, &p); 269f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liu} 2707e09a9f10bb301635b6f9206b3144878a2710b0aJens Axboe#endif 271f2a2ce0eedb44eaa8689e4cbfa77c79b1751b216Huadong Liu 272ebac4655dd3624f3296ff83be48e0cdc02852f1Jens Axboe#endif 273