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