X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=fio.h;h=8d0207a8785aae947579d22974b53145e8bb7822;hp=8880ea61e7a518c02bc33840f9b0f8571a0c6b76;hb=7bdce1bde82e37c8876270853840c1d09d760b67;hpb=413dd459a7710ba421061e840dd9ac3161c70f20 diff --git a/fio.h b/fio.h index 8880ea61..8d0207a8 100644 --- a/fio.h +++ b/fio.h @@ -29,10 +29,13 @@ enum fio_ddir { }; enum td_ddir { - TD_DDIR_READ = 1 << 0, - TD_DDIR_WRITE = 1 << 1, - TD_DDIR_RAND = 1 << 2, - TD_DDIR_RW = TD_DDIR_READ | TD_DDIR_WRITE, + TD_DDIR_READ = 1 << 0, + TD_DDIR_WRITE = 1 << 1, + TD_DDIR_RAND = 1 << 2, + TD_DDIR_RW = TD_DDIR_READ | TD_DDIR_WRITE, + TD_DDIR_RANDREAD = TD_DDIR_READ | TD_DDIR_RAND, + TD_DDIR_RANDWRITE = TD_DDIR_WRITE | TD_DDIR_RAND, + TD_DDIR_RANDRW = TD_DDIR_RW | TD_DDIR_RAND, }; /* @@ -78,8 +81,9 @@ struct io_piece { #ifdef FIO_HAVE_SYSLET struct syslet_req { - struct syslet_uatom atom; - long ret; + struct syslet_uatom atom; /* the atom to submit */ + struct syslet_uatom *head; /* head of the sequence */ + long ret; /* syscall return value */ }; #endif @@ -141,6 +145,11 @@ struct io_u { struct fio_file *file; struct list_head list; + + /* + * Callback for io completion + */ + int (*end_io)(struct io_u *); }; /* @@ -205,8 +214,8 @@ enum fio_ioengine_flags { FIO_CPUIO = 1 << 1, /* cpu burner, doesn't do real io */ FIO_MMAPIO = 1 << 2, /* uses memory mapped io */ FIO_RAWIO = 1 << 3, /* some sort of direct/raw io */ - FIO_NETIO = 1 << 4, /* networked io */ - FIO_NULLIO = 1 << 5, /* no real data transfer (cpu/null) */ + FIO_DISKLESSIO = 1 << 4, /* no disk involved */ + FIO_SELFOPEN = 1 << 5, /* opens its own devices */ }; /* @@ -239,7 +248,21 @@ struct fio_file { unsigned int unlink; }; +/* + * How many depth levels to log + */ +#define FIO_IO_U_MAP_NR 8 +#define FIO_IO_U_LAT_NR 12 + struct thread_stat { + char *name; + char *verror; + int error; + int groupid; + pid_t pid; + char *description; + int members; + struct io_log *slat_log; struct io_log *clat_log; struct io_log *bw_log; @@ -262,23 +285,29 @@ struct thread_stat { unsigned long usr_time; unsigned long sys_time; unsigned long ctx; -}; -/* - * How many depth levels to log - */ -#define FIO_IO_U_MAP_NR 8 -#define FIO_IO_U_LAT_NR 12 + /* + * IO depth and latency stats + */ + unsigned int io_u_map[FIO_IO_U_MAP_NR]; + unsigned int io_u_lat[FIO_IO_U_LAT_NR]; + unsigned long total_io_u; + + unsigned long long io_bytes[2]; + unsigned long runtime[2]; + unsigned long total_run_time; +}; /* * This describes a single thread/process executing a fio job. */ struct thread_data { + int pad; char *description; char *name; char *directory; char *filename; - char verror[80]; + char verror[128]; pthread_t thread; int thread_number; int groupid; @@ -286,6 +315,7 @@ struct thread_data { enum fio_filetype filetype; struct fio_file *files; unsigned int nr_files; + unsigned int nr_open_files; unsigned int nr_uniq_files; union { unsigned int next_file; @@ -341,6 +371,7 @@ struct thread_data { unsigned int numjobs; unsigned int iodepth; unsigned int iodepth_low; + unsigned int iodepth_batch; os_cpu_mask_t cpumask; unsigned int iolog; unsigned int read_iolog; @@ -349,6 +380,7 @@ struct thread_data { unsigned int rwmixwrite; unsigned int nice; unsigned int file_service_type; + unsigned int group_reporting; char *read_iolog_file; char *write_iolog_file; @@ -373,12 +405,10 @@ struct thread_data { * Current IO depth and list of free and busy io_u's. */ unsigned int cur_depth; - unsigned int io_u_map[FIO_IO_U_MAP_NR]; - unsigned int io_u_lat[FIO_IO_U_LAT_NR]; - unsigned long total_io_u; struct list_head io_u_freelist; struct list_head io_u_busylist; struct list_head io_u_requeues; + unsigned int io_u_queued; /* * Rate state @@ -391,7 +421,6 @@ struct thread_data { unsigned long rate_bytes; struct timeval lastrate; - unsigned long runtime[2]; /* msec */ unsigned long long io_size; unsigned long long total_file_size; unsigned long long start_offset; @@ -417,7 +446,6 @@ struct thread_data { struct timeval start; /* start of this loop */ struct timeval epoch; /* time job was started */ - struct timeval end_time;/* time job ended */ /* * read/write mixed workload state @@ -540,11 +568,6 @@ struct disk_util { struct timeval time; }; -/* - * Callback for io completion - */ -typedef int (endio_handler)(struct io_u *); - #define DISK_UTIL_MSEC (250) #ifndef min @@ -611,6 +634,8 @@ extern int __must_check init_random_state(struct thread_data *); extern void close_files(struct thread_data *); extern int __must_check setup_files(struct thread_data *); extern int __must_check open_files(struct thread_data *); +extern int open_file(struct thread_data *, struct fio_file *, int, int); +extern void close_file(struct thread_data *, struct fio_file *); extern int __must_check file_invalidate_cache(struct thread_data *, struct fio_file *); /* @@ -659,9 +684,10 @@ 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 requeue_io_u(struct thread_data *, struct io_u **); -extern long __must_check io_u_sync_complete(struct thread_data *, struct io_u *, endio_handler *); -extern long __must_check io_u_queued_complete(struct thread_data *, int, endio_handler *); +extern long __must_check io_u_sync_complete(struct thread_data *, struct io_u *); +extern long __must_check io_u_queued_complete(struct thread_data *, int); extern void io_u_queued(struct thread_data *, struct io_u *); +extern void io_u_log_error(struct thread_data *, struct io_u *); extern void io_u_init_timeout(void); extern void io_u_set_timeout(struct thread_data *); @@ -708,6 +734,9 @@ static inline void fio_sem_up(volatile int *sem) fprintf(stderr, ##args); \ } while (0) +FILE *get_f_out(void); +FILE *get_f_err(void); + struct ioengine_ops { struct list_head list; char name[16];