enum {
FIO_Q_COMPLETED = 0, /* completed sync */
FIO_Q_QUEUED = 1, /* queued, will complete async */
+ FIO_Q_BUSY = 2, /* no more room, call ->commit() */
};
#define FIO_HDR_MAGIC 0xf00baaef
unsigned long total_io_u;
struct list_head io_u_freelist;
struct list_head io_u_busylist;
+ struct list_head io_u_requeues;
/*
* Rate state
unsigned long long start_offset;
unsigned long long total_io_size;
+ unsigned long io_issues[2];
unsigned long long io_blocks[2];
unsigned long long io_bytes[2];
unsigned long long zone_bytes;
};
/*
- * Used for passing io_u completion data
+ * Callback for io completion
*/
-typedef int (icd_handler)(struct io_u *);
-struct io_completion_data {
- int nr; /* input */
- icd_handler *handler; /* input */
-
- int error; /* output */
- unsigned long bytes_done[2]; /* output */
- struct timeval time; /* output */
-};
+typedef int (endio_handler)(struct io_u *);
#define DISK_UTIL_MSEC (250)
extern struct io_u *__get_io_u(struct thread_data *);
extern struct io_u *get_io_u(struct thread_data *, struct fio_file *);
extern void put_io_u(struct thread_data *, struct io_u *);
-extern void ios_completed(struct thread_data *, struct io_completion_data *);
-extern void io_completed(struct thread_data *, struct io_u *, struct io_completion_data *);
-extern void init_icd(struct io_completion_data *, icd_handler *, int);
+extern void requeue_io_u(struct thread_data *, struct io_u **);
+extern long io_u_sync_complete(struct thread_data *, struct io_u *, endio_handler *);
+extern long io_u_queued_complete(struct thread_data *, int, endio_handler *);
/*
* io engine entry points
extern int td_io_queue(struct thread_data *, struct io_u *);
extern int td_io_sync(struct thread_data *, struct fio_file *);
extern int td_io_getevents(struct thread_data *, int, int, struct timespec *);
+extern int td_io_commit(struct thread_data *);
/*
* This is a pretty crappy semaphore implementation, but with the use that fio
int (*init)(struct thread_data *);
int (*prep)(struct thread_data *, struct io_u *);
int (*queue)(struct thread_data *, struct io_u *);
+ int (*commit)(struct thread_data *);
int (*getevents)(struct thread_data *, int, int, struct timespec *);
struct io_u *(*event)(struct thread_data *, int);
int (*cancel)(struct thread_data *, struct io_u *);
unsigned long priv;
};
-#define FIO_IOOPS_VERSION 4
+#define FIO_IOOPS_VERSION 5
extern struct ioengine_ops *load_ioengine(struct thread_data *, const char *);
extern int register_ioengine(struct ioengine_ops *);