#include <assert.h>
#include "compiler/compiler.h"
-#include "list.h"
+#include "flist.h"
#include "fifo.h"
#include "rbtree.h"
#include "arch/arch.h"
#include <guasi.h>
#endif
+#ifdef FIO_HAVE_SOLARISAIO
+#include <sys/asynch.h>
+#endif
+
enum fio_ddir {
DDIR_READ = 0,
DDIR_WRITE,
struct io_piece {
union {
struct rb_node rb_node;
- struct list_head list;
+ struct flist_head list;
};
union {
int fileno;
#endif
#ifdef FIO_HAVE_GUASI
guasi_req_t greq;
+#endif
+#ifdef FIO_HAVE_SOLARISAIO
+ aio_result_t resultp;
#endif
};
struct timeval start_time;
union {
unsigned int index;
unsigned int seen;
+ void *engine_data;
};
unsigned int flags;
struct fio_file *file;
- struct list_head list;
+ struct flist_head list;
/*
* Callback for io completion
* this structure holds state information for a single file.
*/
struct fio_file {
- struct list_head hash_list;
+ struct flist_head hash_list;
enum fio_filetype filetype;
/*
/*
* block map for random io
*/
- unsigned long *file_map;
+ unsigned int *file_map;
unsigned int num_maps;
unsigned int last_free_lookup;
* IO depth and latency stats
*/
unsigned int io_u_map[FIO_IO_U_MAP_NR];
+ unsigned int io_u_submit[FIO_IO_U_MAP_NR];
+ unsigned int io_u_complete[FIO_IO_U_MAP_NR];
unsigned int io_u_lat_u[FIO_IO_U_LAT_U_NR];
unsigned int io_u_lat_m[FIO_IO_U_LAT_M_NR];
unsigned long total_io_u[2];
unsigned long short_io_u[2];
+ unsigned long total_submit;
+ unsigned long total_complete;
unsigned long long io_bytes[2];
unsigned long runtime[2];
*/
unsigned int cur_depth;
unsigned int io_u_queued;
- struct list_head io_u_freelist;
- struct list_head io_u_busylist;
- struct list_head io_u_requeues;
+ struct flist_head io_u_freelist;
+ struct flist_head io_u_busylist;
+ struct flist_head io_u_requeues;
/*
* Rate state
* if we are overwriting. Otherwise just use a fifo.
*/
struct rb_root io_hist_tree;
- struct list_head io_hist_list;
+ struct flist_head io_hist_list;
/*
* For IO replaying
*/
- struct list_head io_log_list;
+ struct flist_head io_log_list;
/*
* timeout handling
assert(!(io_u->ddir == DDIR_WRITE && !td_write(td)));
}
-#define BLOCKS_PER_MAP (8 * sizeof(long))
+#define BLOCKS_PER_MAP (8 * sizeof(int))
#define TO_MAP_BLOCK(f, b) (b)
#define RAND_MAP_IDX(f, b) (TO_MAP_BLOCK(f, b) / BLOCKS_PER_MAP)
#define RAND_MAP_BIT(f, b) (TO_MAP_BLOCK(f, b) & (BLOCKS_PER_MAP - 1))
* Per-device disk util management
*/
struct disk_util {
- struct list_head list;
+ struct flist_head list;
char *name;
char *sysfs_root;
extern void init_disk_util(struct thread_data *);
extern void update_rusage_stat(struct thread_data *);
extern void update_io_ticks(void);
-extern void disk_util_timer_arm(void);
extern void setup_log(struct io_log **);
extern void finish_log(struct thread_data *, struct io_log *, const char *);
extern void __finish_log(struct io_log *, const char *);
*/
#ifdef FIO_HAVE_DISK_UTIL
extern void show_disk_util(void);
-extern void disk_util_timer_arm(void);
extern void init_disk_util(struct thread_data *);
extern void update_io_ticks(void);
#else
#define show_disk_util()
-#define disk_util_timer_arm()
#define init_disk_util(td)
#define update_io_ticks()
#endif
/*
* io unit handling
*/
-#define queue_full(td) list_empty(&(td)->io_u_freelist)
+#define queue_full(td) flist_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 *);
extern void put_io_u(struct thread_data *, struct io_u *);
extern void io_u_set_timeout(struct thread_data *);
extern void io_u_mark_depth(struct thread_data *, unsigned int);
extern void io_u_fill_buffer(struct thread_data *td, struct io_u *, unsigned int);
+void io_u_mark_complete(struct thread_data *, unsigned int);
+void io_u_mark_submit(struct thread_data *, unsigned int);
/*
* io engine entry points
#endif
struct ioengine_ops {
- struct list_head list;
+ struct flist_head list;
char name[16];
int version;
int flags;
struct fio_file *f = io_u->file;
dprint(FD_IO, "%s: io_u %p: off=%llu/len=%lu/ddir=%d", p, io_u,
- io_u->offset, io_u->buflen, io_u->ddir);
+ (unsigned long long) io_u->offset,
+ io_u->buflen, io_u->ddir);
if (fio_debug & (1 << FD_IO)) {
if (f)
log_info("/%s", f->file_name);