X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=fio.h;h=8880ea61e7a518c02bc33840f9b0f8571a0c6b76;hp=7a4b1d19c8ebfa527814bee59976b014b5de9a99;hb=413dd459a7710ba421061e840dd9ac3161c70f20;hpb=a2f77c9f5f01186882762264100b6d30ee77a55d diff --git a/fio.h b/fio.h index 7a4b1d19..8880ea61 100644 --- a/fio.h +++ b/fio.h @@ -28,6 +28,13 @@ enum fio_ddir { DDIR_SYNC, }; +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, +}; + /* * Use for maintaining statistics */ @@ -280,19 +287,20 @@ struct thread_data { struct fio_file *files; unsigned int nr_files; unsigned int nr_uniq_files; - unsigned int next_file; + union { + unsigned int next_file; + os_random_state_t next_file_state; + }; int error; pid_t pid; char *orig_buffer; size_t orig_buffer_size; volatile int terminate; volatile int runstate; - enum fio_ddir ddir; - unsigned int iomix; + enum td_ddir td_ddir; unsigned int ioprio; unsigned int last_was_sync; - unsigned int sequential; unsigned int odirect; unsigned int invalidate_cache; unsigned int create_serialize; @@ -340,6 +348,7 @@ struct thread_data { unsigned int rwmixread; unsigned int rwmixwrite; unsigned int nice; + unsigned int file_service_type; char *read_iolog_file; char *write_iolog_file; @@ -436,6 +445,14 @@ struct thread_data { struct itimerval timer; }; +/* + * roundrobin available files, or choose one at random. + */ +enum { + FIO_FSERVICE_RANDOM = 1, + FIO_FSERVICE_RR = 2, +}; + /* * 30 second per-io_u timeout, with 5 second intervals to avoid resetting * the timer on each queue operation. @@ -443,18 +460,20 @@ struct thread_data { #define IO_U_TIMEOUT_INC 5 #define IO_U_TIMEOUT 30 -#define __td_verror(td, err, msg) \ +#define __td_verror(td, err, msg, func) \ do { \ if ((td)->error) \ break; \ int e = (err); \ (td)->error = e; \ - snprintf(td->verror, sizeof(td->verror) - 1, "file:%s:%d, error=%s", __FILE__, __LINE__, (msg)); \ + snprintf(td->verror, sizeof(td->verror) - 1, "file:%s:%d, func=%s, error=%s", __FILE__, __LINE__, (func), (msg)); \ } while (0) -#define td_verror(td, err) __td_verror((td), (err), strerror((err))) -#define td_vmsg(td, err, msg) __td_verror((td), (err), (msg)) +#define td_verror(td, err, func) \ + __td_verror((td), (err), strerror((err)), (func)) +#define td_vmsg(td, err, msg, func) \ + __td_verror((td), (err), (msg), (func)) extern int exitall_on_terminate; extern int thread_number; @@ -468,9 +487,10 @@ extern unsigned long long mlock_size; extern struct thread_data *threads; -#define td_read(td) ((td)->ddir == DDIR_READ) -#define td_write(td) ((td)->ddir == DDIR_WRITE) -#define td_rw(td) ((td)->iomix != 0) +#define td_read(td) ((td)->td_ddir & TD_DDIR_READ) +#define td_write(td) ((td)->td_ddir & TD_DDIR_WRITE) +#define td_rw(td) (((td)->td_ddir & TD_DDIR_RW) == TD_DDIR_RW) +#define td_random(td) ((td)->td_ddir & TD_DDIR_RAND) #define BLOCKS_PER_MAP (8 * sizeof(long)) #define TO_MAP_BLOCK(td, f, b) ((b) - ((f)->file_offset / (td)->rw_min_bs)) @@ -574,7 +594,7 @@ extern unsigned long time_since_now(struct timeval *); extern unsigned long mtime_since_genesis(void); extern void __usec_sleep(unsigned int); extern void usec_sleep(struct thread_data *, unsigned long); -extern void rate_throttle(struct thread_data *, unsigned long, unsigned int, int); +extern void rate_throttle(struct thread_data *, unsigned long, unsigned int); extern void fill_start_time(struct timeval *); extern void fio_gettime(struct timeval *, void *); extern void set_genesis_time(void);