#include "mutex.h"
#include "log.h"
#include "debug.h"
+#include "file.h"
+#include "io_ddir.h"
#ifdef FIO_HAVE_GUASI
#include <guasi.h>
#include <sys/asynch.h>
#endif
-enum fio_ddir {
- DDIR_READ = 0,
- DDIR_WRITE,
- DDIR_SYNC,
- DDIR_INVAL = -1,
-};
-
-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_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,
-};
-
-enum file_lock_mode {
- FILE_LOCK_NONE,
- FILE_LOCK_EXCLUSIVE,
- FILE_LOCK_READWRITE,
-};
-
/*
* Use for maintaining statistics
*/
unsigned long time;
unsigned long val;
enum fio_ddir ddir;
+ unsigned int bs;
};
/*
#ifdef FIO_HAVE_SOLARISAIO
aio_result_t resultp;
#endif
+ void *mmap_data;
};
struct timeval start_time;
struct timeval issue_time;
void *buf;
unsigned long buflen;
unsigned long long offset;
- unsigned long long endpos;
/*
* IO engine state, may be different from above when we get
FIO_Q_BUSY = 2, /* no more room, call ->commit() */
};
-#define FIO_HDR_MAGIC 0xf00baaef
-
-enum {
- VERIFY_NONE = 0, /* no verification */
- VERIFY_MD5, /* md5 sum data blocks */
- VERIFY_CRC64, /* crc64 sum data blocks */
- VERIFY_CRC32, /* crc32 sum data blocks */
- VERIFY_CRC32C, /* crc32c sum data blocks */
- VERIFY_CRC32C_INTEL, /* crc32c sum data blocks with hw */
- VERIFY_CRC16, /* crc16 sum data blocks */
- VERIFY_CRC7, /* crc7 sum data blocks */
- VERIFY_SHA256, /* sha256 sum data blocks */
- VERIFY_SHA512, /* sha512 sum data blocks */
- VERIFY_META, /* block_num, timestamp etc. */
- VERIFY_NULL, /* pretend to verify */
-};
-
-/*
- * A header structure associated with each checksummed data block. It is
- * followed by a checksum specific header that contains the verification
- * data.
- */
-struct verify_header {
- unsigned int fio_magic;
- unsigned int len;
- unsigned int verify_type;
-};
-
-struct vhdr_md5 {
- uint32_t md5_digest[16];
-};
-struct vhdr_sha512 {
- uint8_t sha512[128];
-};
-struct vhdr_sha256 {
- uint8_t sha256[128];
-};
-struct vhdr_crc64 {
- uint64_t crc64;
-};
-struct vhdr_crc32 {
- uint32_t crc32;
-};
-struct vhdr_crc16 {
- uint16_t crc16;
-};
-struct vhdr_crc7 {
- uint8_t crc7;
-};
-struct vhdr_meta {
- uint64_t offset;
- unsigned char thread;
- unsigned short numberio;
- unsigned long time_sec;
- unsigned long time_usec;
-};
-
struct group_run_stats {
unsigned long long max_run[2], min_run[2];
unsigned long long max_bw[2], min_bw[2];
MEM_MMAPHUGE, /* memory mapped huge file */
};
-/*
- * The type of object we are working on
- */
-enum fio_filetype {
- FIO_TYPE_FILE = 1, /* plain file */
- FIO_TYPE_BD, /* block device */
- FIO_TYPE_CHAR, /* character device */
- FIO_TYPE_PIPE, /* pipe */
-};
-
enum fio_ioengine_flags {
FIO_SYNCIO = 1 << 0, /* io engine has synchronous ->queue */
FIO_RAWIO = 1 << 1, /* some sort of direct/raw io */
FIO_SIGQUIT = 1 << 7, /* needs SIGQUIT to exit */
};
-enum fio_file_flags {
- FIO_FILE_OPEN = 1 << 0, /* file is open */
- FIO_FILE_CLOSING = 1 << 1, /* file being closed */
- FIO_FILE_EXTEND = 1 << 2, /* needs extend */
- FIO_FILE_DONE = 1 << 3, /* io completed to this file */
- FIO_SIZE_KNOWN = 1 << 4, /* size has been set */
- FIO_FILE_HASHED = 1 << 5, /* file is on hash */
-};
-
-/*
- * Each thread_data structure has a number of files associated with it,
- * this structure holds state information for a single file.
- */
-struct fio_file {
- struct flist_head hash_list;
- enum fio_filetype filetype;
-
- /*
- * A file may not be a file descriptor, let the io engine decide
- */
- union {
- unsigned long file_data;
- int fd;
- };
-
- /*
- * filename and possible memory mapping
- */
- char *file_name;
- void *mmap;
- unsigned int major, minor;
-
- /*
- * size of the file, offset into file, and io size from that offset
- */
- unsigned long long real_file_size;
- unsigned long long file_offset;
- unsigned long long io_size;
-
- unsigned long long last_pos;
-
- /*
- * if io is protected by a semaphore, this is set
- */
- struct fio_mutex *lock;
- void *lock_owner;
- unsigned int lock_batch;
- enum fio_ddir lock_ddir;
-
- /*
- * block map for random io
- */
- unsigned int *file_map;
- unsigned int num_maps;
- unsigned int last_free_lookup;
-
- int references;
- enum fio_file_flags flags;
-};
-
/*
* How many depth levels to log
*/
unsigned long long start_offset;
unsigned int bs[2];
+ unsigned int ba[2];
unsigned int min_bs[2];
unsigned int max_bs[2];
- struct bssplit *bssplit;
- unsigned int bssplit_nr;
+ struct bssplit *bssplit[2];
+ unsigned int bssplit_nr[2];
unsigned int nr_files;
unsigned int open_files;
unsigned int create_fsync;
unsigned int create_on_open;
unsigned int end_fsync;
+ unsigned int pre_read;
unsigned int sync_io;
unsigned int verify;
unsigned int do_verify;
char *sysfs_root;
+ unsigned long rand_seeds[6];
+
os_random_state_t bsrange_state;
os_random_state_t verify_state;
unsigned long msec;
struct timeval time;
+
+ struct fio_mutex *lock;
+ unsigned long users;
};
+static inline void disk_util_inc(struct disk_util *du)
+{
+ if (du) {
+ fio_mutex_down(du->lock);
+ du->users++;
+ fio_mutex_up(du->lock);
+ }
+}
+
+static inline void disk_util_dec(struct disk_util *du)
+{
+ if (du) {
+ fio_mutex_down(du->lock);
+ du->users--;
+ fio_mutex_up(du->lock);
+ }
+}
+
#define DISK_UTIL_MSEC (250)
/*
/*
* Logging
*/
-extern void add_clat_sample(struct thread_data *, enum fio_ddir, unsigned long);
-extern void add_slat_sample(struct thread_data *, enum fio_ddir, unsigned long);
-extern void add_bw_sample(struct thread_data *, enum fio_ddir, struct timeval *);
+extern void add_clat_sample(struct thread_data *, enum fio_ddir, unsigned long,
+ unsigned int);
+extern void add_slat_sample(struct thread_data *, enum fio_ddir, unsigned long,
+ unsigned int);
+extern void add_bw_sample(struct thread_data *, enum fio_ddir, unsigned int,
+ struct timeval *);
extern void show_run_stats(void);
extern void init_disk_util(struct thread_data *);
extern void update_rusage_stat(struct thread_data *);
extern void __finish_log(struct io_log *, const char *);
extern struct io_log *agg_io_log[2];
extern int write_bw_log;
-extern void add_agg_sample(unsigned long, enum fio_ddir);
+extern void add_agg_sample(unsigned long, enum fio_ddir, unsigned int);
/*
* Time functions
extern void fio_options_dup_and_init(struct option *);
extern void options_mem_dupe(struct thread_data *);
extern void options_mem_free(struct thread_data *);
+extern void td_fill_rand_seeds(struct thread_data *);
#define FIO_GETOPT_JOB 0x89988998
#define FIO_NR_OPTIONS 128
extern int __must_check generic_open_file(struct thread_data *, struct fio_file *);
extern int __must_check generic_close_file(struct thread_data *, struct fio_file *);
extern int __must_check generic_get_file_size(struct thread_data *, struct fio_file *);
+extern int __must_check pre_read_files(struct thread_data *);
extern int add_file(struct thread_data *, const char *);
extern void get_file(struct fio_file *);
extern int __must_check put_file(struct thread_data *, struct fio_file *);
TD_INITIALIZED,
TD_RAMP,
TD_RUNNING,
+ TD_PRE_READING,
TD_VERIFYING,
TD_FSYNCING,
TD_EXITED,
extern void td_set_runstate(struct thread_data *, int);
-/*
- * Verify helpers
- */
-extern void populate_verify_io_u(struct thread_data *, struct io_u *);
-extern int __must_check get_next_verify(struct thread_data *td, struct io_u *);
-extern int __must_check verify_io_u(struct thread_data *, struct io_u *);
-
/*
* Memory helpers
*/
{
f->last_free_lookup = 0;
f->last_pos = f->file_offset;
+ if (f->file_map)
+ memset(f->file_map, 0, f->num_maps * sizeof(int));
}
static inline void clear_error(struct thread_data *td)