1dcefb588d556828af570221b2dc276a6376c8557Jens Axboe#ifndef FIO_IOENGINE_H
2dcefb588d556828af570221b2dc276a6376c8557Jens Axboe#define FIO_IOENGINE_H
3dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
441666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe#include "compiler/compiler.h"
5836fcc0fceb233ebcc41ee63b4ea5cae20b678a4Jens Axboe#include "os/os.h"
6836fcc0fceb233ebcc41ee63b4ea5cae20b678a4Jens Axboe#include "log.h"
741666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe#include "io_ddir.h"
8ec41265e81c70d8573d1359e27876c37c30c7d9dJens Axboe#include "debug.h"
941666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe#include "file.h"
10ec41265e81c70d8573d1359e27876c37c30c7d9dJens Axboe
1167bf982340d95ca98098ea050b54b4c7adb116c0Jens Axboe#ifdef CONFIG_LIBAIO
1267bf982340d95ca98098ea050b54b4c7adb116c0Jens Axboe#include <libaio.h>
1367bf982340d95ca98098ea050b54b4c7adb116c0Jens Axboe#endif
1467bf982340d95ca98098ea050b54b4c7adb116c0Jens Axboe#ifdef CONFIG_GUASI
1567bf982340d95ca98098ea050b54b4c7adb116c0Jens Axboe#include <guasi.h>
1667bf982340d95ca98098ea050b54b4c7adb116c0Jens Axboe#endif
1767bf982340d95ca98098ea050b54b4c7adb116c0Jens Axboe
1856785384eb15a937f275292109603e51a5191365Jens Axboe#define FIO_IOOPS_VERSION	18
19dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
20dcefb588d556828af570221b2dc276a6376c8557Jens Axboeenum {
210c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	IO_U_F_FREE		= 1 << 0,
220c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	IO_U_F_FLIGHT		= 1 << 1,
230c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	IO_U_F_FREE_DEF		= 1 << 2,
240c41214ff4e6f31f8df64aac37be7853aada6f1fRadha Ramachandran	IO_U_F_IN_CUR_DEPTH	= 1 << 3,
2538dad62d5154ffaad445bd0231b271b9a46a5190Jens Axboe	IO_U_F_BUSY_OK		= 1 << 4,
260d29de831183dfd049c97a03008d425ce21e2fa4Jens Axboe	IO_U_F_TRIMMED		= 1 << 5,
271ef2b6be973eded12827990ae1a9eb28b7b20be7Jens Axboe	IO_U_F_BARRIER		= 1 << 6,
2882af2a7ca1a543b41c003de69d5e3c36860f47d5Jens Axboe	IO_U_F_VER_LIST		= 1 << 7,
29dcefb588d556828af570221b2dc276a6376c8557Jens Axboe};
30dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
31dcefb588d556828af570221b2dc276a6376c8557Jens Axboe/*
32dcefb588d556828af570221b2dc276a6376c8557Jens Axboe * The io unit
33dcefb588d556828af570221b2dc276a6376c8557Jens Axboe */
34dcefb588d556828af570221b2dc276a6376c8557Jens Axboestruct io_u {
35dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	struct timeval start_time;
36dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	struct timeval issue_time;
37dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
38d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe	struct fio_file *file;
39d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe	unsigned int flags;
40d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe	enum fio_ddir ddir;
41d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe
42dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	/*
43bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe	 * For replay workloads, we may want to account as a different
44bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe	 * IO type than what is being submitted.
45bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe	 */
46bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe	enum fio_ddir acct_ddir;
47bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe
48bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe	/*
49dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	 * Allocated/set buffer and length
50dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	 */
51dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	unsigned long buflen;
52dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	unsigned long long offset;
53da0a7bd224bb9331f27bb4b20394dd5c8fa3acb0Juan Casse	unsigned short numberio;
54d72be5454c8c5378f16804ff9b8d1afe8729a380Jens Axboe	void *buf;
55dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
56dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	/*
577d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	 * Initial seed for generating the buffer contents
587d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	 */
59363cffa71a96eb4c7595bb8c325a09eb01f766a5Grant Grundler	uint64_t rand_seed;
607d9fb455aadc0c0363489591775496f27f4a560aJens Axboe
617d9fb455aadc0c0363489591775496f27f4a560aJens Axboe	/*
62dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	 * IO engine state, may be different from above when we get
63dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	 * partial transfers / residual data counts
64dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	 */
65dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	void *xfer_buf;
66dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	unsigned long xfer_buflen;
67dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
689522850758ecad087891710b391b4e77f6bff839Jens Axboe	/*
699522850758ecad087891710b391b4e77f6bff839Jens Axboe	 * Parameter related to pre-filled buffers and
709522850758ecad087891710b391b4e77f6bff839Jens Axboe	 * their size to handle variable block sizes.
719522850758ecad087891710b391b4e77f6bff839Jens Axboe	 */
729522850758ecad087891710b391b4e77f6bff839Jens Axboe	unsigned long buf_filled_len;
739522850758ecad087891710b391b4e77f6bff839Jens Axboe
74f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe	struct io_piece *ipo;
75f940128526dbe468a1951cce10c2fe5dbd23875fJens Axboe
76225ba9e3433cf27d8ff7b213d9f78b7ef2776c70Jens Axboe	unsigned int resid;
77225ba9e3433cf27d8ff7b213d9f78b7ef2776c70Jens Axboe	unsigned int error;
78225ba9e3433cf27d8ff7b213d9f78b7ef2776c70Jens Axboe
79225ba9e3433cf27d8ff7b213d9f78b7ef2776c70Jens Axboe	/*
80225ba9e3433cf27d8ff7b213d9f78b7ef2776c70Jens Axboe	 * io engine private data
81225ba9e3433cf27d8ff7b213d9f78b7ef2776c70Jens Axboe	 */
82225ba9e3433cf27d8ff7b213d9f78b7ef2776c70Jens Axboe	union {
83225ba9e3433cf27d8ff7b213d9f78b7ef2776c70Jens Axboe		unsigned int index;
84225ba9e3433cf27d8ff7b213d9f78b7ef2776c70Jens Axboe		unsigned int seen;
85225ba9e3433cf27d8ff7b213d9f78b7ef2776c70Jens Axboe		void *engine_data;
86225ba9e3433cf27d8ff7b213d9f78b7ef2776c70Jens Axboe	};
87225ba9e3433cf27d8ff7b213d9f78b7ef2776c70Jens Axboe
88225ba9e3433cf27d8ff7b213d9f78b7ef2776c70Jens Axboe	struct flist_head verify_list;
89225ba9e3433cf27d8ff7b213d9f78b7ef2776c70Jens Axboe
90225ba9e3433cf27d8ff7b213d9f78b7ef2776c70Jens Axboe	/*
91225ba9e3433cf27d8ff7b213d9f78b7ef2776c70Jens Axboe	 * Callback for io completion
92225ba9e3433cf27d8ff7b213d9f78b7ef2776c70Jens Axboe	 */
93225ba9e3433cf27d8ff7b213d9f78b7ef2776c70Jens Axboe	int (*end_io)(struct thread_data *, struct io_u *);
94225ba9e3433cf27d8ff7b213d9f78b7ef2776c70Jens Axboe
952ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe	union {
962ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe#ifdef CONFIG_LIBAIO
972ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe		struct iocb iocb;
982ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe#endif
992ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe#ifdef CONFIG_POSIXAIO
1002ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe		os_aiocb_t aiocb;
1012ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe#endif
1022ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe#ifdef FIO_HAVE_SGIO
1032ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe		struct sg_io_hdr hdr;
1042ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe#endif
1052ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe#ifdef CONFIG_GUASI
1062ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe		guasi_req_t greq;
1072ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe#endif
1082ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe#ifdef CONFIG_SOLARISAIO
1092ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe		aio_result_t resultp;
1102ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe#endif
1112ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe#ifdef FIO_HAVE_BINJECT
1122ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe		struct b_user_cmd buc;
1132ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe#endif
1142ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe#ifdef CONFIG_RDMA
1152ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe		struct ibv_mr *mr;
1162ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe#endif
1172ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe		void *mmap_data;
1182ae0b204743d6b4048c6fffd46c6280a70f2ecd1Jens Axboe	};
119dcefb588d556828af570221b2dc276a6376c8557Jens Axboe};
120dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
121dcefb588d556828af570221b2dc276a6376c8557Jens Axboe/*
122dcefb588d556828af570221b2dc276a6376c8557Jens Axboe * io_ops->queue() return values
123dcefb588d556828af570221b2dc276a6376c8557Jens Axboe */
124dcefb588d556828af570221b2dc276a6376c8557Jens Axboeenum {
125dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	FIO_Q_COMPLETED	= 0,		/* completed sync */
126dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	FIO_Q_QUEUED	= 1,		/* queued, will complete async */
127dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	FIO_Q_BUSY	= 2,		/* no more room, call ->commit() */
128dcefb588d556828af570221b2dc276a6376c8557Jens Axboe};
129dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
130dcefb588d556828af570221b2dc276a6376c8557Jens Axboestruct ioengine_ops {
131dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	struct flist_head list;
132dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	char name[16];
133dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	int version;
134dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	int flags;
135dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	int (*setup)(struct thread_data *);
136dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	int (*init)(struct thread_data *);
137dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	int (*prep)(struct thread_data *, struct io_u *);
138dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	int (*queue)(struct thread_data *, struct io_u *);
139dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	int (*commit)(struct thread_data *);
140dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	int (*getevents)(struct thread_data *, unsigned int, unsigned int, struct timespec *);
141dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	struct io_u *(*event)(struct thread_data *, int);
142dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	int (*cancel)(struct thread_data *, struct io_u *);
143dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	void (*cleanup)(struct thread_data *);
144dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	int (*open_file)(struct thread_data *, struct fio_file *);
145dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	int (*close_file)(struct thread_data *, struct fio_file *);
146dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	int (*get_file_size)(struct thread_data *, struct fio_file *);
14736d80bc7c7f7fbc2612941b7dd7ceaf645798c7fJens Axboe	void (*terminate)(struct thread_data *);
148c73ed24623ad94a5254e8302298797aba2eb1e9aJens Axboe	int (*io_u_init)(struct thread_data *, struct io_u *);
149c73ed24623ad94a5254e8302298797aba2eb1e9aJens Axboe	void (*io_u_free)(struct thread_data *, struct io_u *);
150de890a1e48d40238dac69f302708dde8719de240Steven Lang	int option_struct_size;
151de890a1e48d40238dac69f302708dde8719de240Steven Lang	struct fio_option *options;
152dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	void *data;
153dcefb588d556828af570221b2dc276a6376c8557Jens Axboe	void *dlhandle;
154dcefb588d556828af570221b2dc276a6376c8557Jens Axboe};
155dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
1562b4f4abec640f36ccdff39de00e74b2234e27116Jens Axboeenum fio_ioengine_flags {
1572b4f4abec640f36ccdff39de00e74b2234e27116Jens Axboe	FIO_SYNCIO	= 1 << 0,	/* io engine has synchronous ->queue */
1582b4f4abec640f36ccdff39de00e74b2234e27116Jens Axboe	FIO_RAWIO	= 1 << 1,	/* some sort of direct/raw io */
1592b4f4abec640f36ccdff39de00e74b2234e27116Jens Axboe	FIO_DISKLESSIO	= 1 << 2,	/* no disk involved */
1602b4f4abec640f36ccdff39de00e74b2234e27116Jens Axboe	FIO_NOEXTEND	= 1 << 3,	/* engine can't extend file */
16193bcfd20e37cef8cec350fe06d3a086724c9f257Bruce Cran	FIO_NODISKUTIL  = 1 << 4,	/* diskutil can't handle filename */
1622b4f4abec640f36ccdff39de00e74b2234e27116Jens Axboe	FIO_UNIDIR	= 1 << 5,	/* engine is uni-directional */
1632b4f4abec640f36ccdff39de00e74b2234e27116Jens Axboe	FIO_NOIO	= 1 << 6,	/* thread does only pseudo IO */
16436d80bc7c7f7fbc2612941b7dd7ceaf645798c7fJens Axboe	FIO_PIPEIO	= 1 << 7,	/* input/output no seekable */
16536d80bc7c7f7fbc2612941b7dd7ceaf645798c7fJens Axboe	FIO_BARRIER	= 1 << 8,	/* engine supports barriers */
16636d80bc7c7f7fbc2612941b7dd7ceaf645798c7fJens Axboe	FIO_MEMALIGN	= 1 << 9,	/* engine wants aligned memory */
167ad705bcb7e79a7cdb9891db17b4c40b13b6c30c3Steven Noonan	FIO_BIT_BASED	= 1 << 10,	/* engine uses a bit base (e.g. uses Kbit as opposed to KB) */
1682b4f4abec640f36ccdff39de00e74b2234e27116Jens Axboe};
169dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
170dcefb588d556828af570221b2dc276a6376c8557Jens Axboe/*
171a8075704d3392fede7bd7cfa394616fa0eed7ae0Daniel Gollub * External engine defined symbol to fill in the engine ops structure
172a8075704d3392fede7bd7cfa394616fa0eed7ae0Daniel Gollub */
173a8075704d3392fede7bd7cfa394616fa0eed7ae0Daniel Gollubtypedef void (*get_ioengine_t)(struct ioengine_ops **);
174a8075704d3392fede7bd7cfa394616fa0eed7ae0Daniel Gollub
175a8075704d3392fede7bd7cfa394616fa0eed7ae0Daniel Gollub/*
176dcefb588d556828af570221b2dc276a6376c8557Jens Axboe * io engine entry points
177dcefb588d556828af570221b2dc276a6376c8557Jens Axboe */
178dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern int __must_check td_io_init(struct thread_data *);
179dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern int __must_check td_io_prep(struct thread_data *, struct io_u *);
180dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern int __must_check td_io_queue(struct thread_data *, struct io_u *);
181dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern int __must_check td_io_sync(struct thread_data *, struct fio_file *);
182dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern int __must_check td_io_getevents(struct thread_data *, unsigned int, unsigned int, struct timespec *);
183dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern int __must_check td_io_commit(struct thread_data *);
184dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern int __must_check td_io_open_file(struct thread_data *, struct fio_file *);
185dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern int td_io_close_file(struct thread_data *, struct fio_file *);
186dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern int __must_check td_io_get_file_size(struct thread_data *, struct fio_file *);
187dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
188dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern struct ioengine_ops *load_ioengine(struct thread_data *, const char *);
189dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern void register_ioengine(struct ioengine_ops *);
190dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern void unregister_ioengine(struct ioengine_ops *);
191de890a1e48d40238dac69f302708dde8719de240Steven Langextern void free_ioengine(struct thread_data *);
192dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern void close_ioengine(struct thread_data *);
193dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
194de890a1e48d40238dac69f302708dde8719de240Steven Langextern int fio_show_ioengine_help(const char *engine);
195de890a1e48d40238dac69f302708dde8719de240Steven Lang
196dcefb588d556828af570221b2dc276a6376c8557Jens Axboe/*
197dcefb588d556828af570221b2dc276a6376c8557Jens Axboe * io unit handling
198dcefb588d556828af570221b2dc276a6376c8557Jens Axboe */
199dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern struct io_u *__get_io_u(struct thread_data *);
200dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern struct io_u *get_io_u(struct thread_data *);
201dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern void put_io_u(struct thread_data *, struct io_u *);
202f2bba1820a567ac00b09916239ac8feb125cead2Radha Ramachandranextern void clear_io_u(struct thread_data *, struct io_u *);
203dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern void requeue_io_u(struct thread_data *, struct io_u **);
204100f49f105126a26de6f1069679c20fd75194188Jens Axboeextern int __must_check io_u_sync_complete(struct thread_data *, struct io_u *, uint64_t *);
205100f49f105126a26de6f1069679c20fd75194188Jens Axboeextern int __must_check io_u_queued_complete(struct thread_data *, int, uint64_t *);
206dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern void io_u_queued(struct thread_data *, struct io_u *);
207002e7183cb86d6100efef690b6fa90bf0988b084Jens Axboeextern void io_u_quiesce(struct thread_data *);
208dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern void io_u_log_error(struct thread_data *, struct io_u *);
209dcefb588d556828af570221b2dc276a6376c8557Jens Axboeextern void io_u_mark_depth(struct thread_data *, unsigned int);
210cc86c395fd9dd2002ec1edc0967b7c9453debdfbJens Axboeextern void fill_io_buffer(struct thread_data *, void *, unsigned int, unsigned int);
2119c42684e32325da26e862280388798343c5f1305Jens Axboeextern void io_u_fill_buffer(struct thread_data *td, struct io_u *, unsigned int, unsigned int);
212dcefb588d556828af570221b2dc276a6376c8557Jens Axboevoid io_u_mark_complete(struct thread_data *, unsigned int);
213dcefb588d556828af570221b2dc276a6376c8557Jens Axboevoid io_u_mark_submit(struct thread_data *, unsigned int);
2143e260a46ea9a8de224c3d0a29a608da3440f284aJens Axboeint queue_full(struct thread_data *);
215dcefb588d556828af570221b2dc276a6376c8557Jens Axboe
2160a28ecda80a78c9d70ae38ced58f3a2fa9c9529dJens Axboeint do_io_u_sync(struct thread_data *, struct io_u *);
217a5f3027cb0495dfe217b2626d248fcc054e7e878Jens Axboeint do_io_u_trim(struct thread_data *, struct io_u *);
21844f29692cfba246981bb3c1b894333a6d2209f51Jens Axboe
219c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe#ifdef FIO_INC_DEBUG
220c592b9fe12d4739d99d5bece517e304804876df6Jens Axboestatic inline void dprint_io_u(struct io_u *io_u, const char *p)
221c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe{
222c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe	struct fio_file *f = io_u->file;
223c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe
224c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe	dprint(FD_IO, "%s: io_u %p: off=%llu/len=%lu/ddir=%d", p, io_u,
225c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe					(unsigned long long) io_u->offset,
226c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe					io_u->buflen, io_u->ddir);
227c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe	if (fio_debug & (1 << FD_IO)) {
228c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe		if (f)
229c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe			log_info("/%s", f->file_name);
230c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe
231c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe		log_info("\n");
232c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe	}
233c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe}
234c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe#else
235c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe#define dprint_io_u(io_u, p)
236c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe#endif
237c592b9fe12d4739d99d5bece517e304804876df6Jens Axboe
238bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboestatic inline enum fio_ddir acct_ddir(struct io_u *io_u)
239bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe{
240bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe	if (io_u->acct_ddir != -1)
241bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe		return io_u->acct_ddir;
242bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe
243bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe	return io_u->ddir;
244bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe}
245bcd5abfa9f230bbe4365dad1289fdea1f5509f74Jens Axboe
246dcefb588d556828af570221b2dc276a6376c8557Jens Axboe#endif
247