Fix busy looping for io_u_queued_complete()
[fio.git] / fio.h
diff --git a/fio.h b/fio.h
index e5e754a903a0a50cb7c80e6dd7717d7591c89e35..12afa0651ae6e6800d7d316d09735a13178d88bf 100644 (file)
--- a/fio.h
+++ b/fio.h
@@ -135,6 +135,7 @@ struct io_u {
 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
@@ -334,6 +335,7 @@ struct thread_data {
        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
@@ -352,6 +354,7 @@ struct thread_data {
        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;
@@ -492,17 +495,9 @@ struct disk_util {
 };
 
 /*
- * 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)
 
@@ -614,11 +609,11 @@ extern void free_io_mem(struct thread_data *);
  */
 #define queue_full(td) list_empty(&(td)->io_u_freelist)
 extern struct io_u *__get_io_u(struct thread_data *);
-extern struct io_u *get_io_u(struct thread_data *, struct fio_file *);
+extern struct io_u *get_io_u(struct thread_data *);
 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
@@ -628,6 +623,7 @@ extern int td_io_prep(struct thread_data *, struct io_u *);
 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
@@ -671,6 +667,7 @@ struct ioengine_ops {
        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 *);
@@ -680,7 +677,7 @@ struct ioengine_ops {
        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 *);