X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=fio.h;h=b05cb3dfc395346fe02775e65d7a4fba5288ed43;hp=b3ba5db2e95ac9e16cd0633bc8912b125c08e333;hb=59b67452b9dab3ad2bc9f1d1dd17c5e3993a66ee;hpb=1368d95b060802f3032bb662144faa99bd521b56 diff --git a/fio.h b/fio.h index b3ba5db2..b05cb3df 100644 --- a/fio.h +++ b/fio.h @@ -36,6 +36,8 @@ #include "lib/rand.h" #include "lib/rbtree.h" #include "lib/num2str.h" +#include "lib/memalign.h" +#include "smalloc.h" #include "client.h" #include "server.h" #include "stat.h" @@ -137,6 +139,7 @@ enum { FIO_RAND_ZONE_OFF, FIO_RAND_POISSON2_OFF, FIO_RAND_POISSON3_OFF, + FIO_RAND_PRIO_CMDS, FIO_RAND_NR_OFFS, }; @@ -146,6 +149,9 @@ enum { RATE_PROCESS_LINEAR = 0, RATE_PROCESS_POISSON = 1, + + THINKTIME_BLOCKS_TYPE_COMPLETE = 0, + THINKTIME_BLOCKS_TYPE_ISSUE = 1, }; enum { @@ -169,8 +175,6 @@ struct zone_split_index { uint64_t size_prev; }; -#define FIO_MAX_OPEN_ZBD_ZONES 128 - /* * This describes a single thread/process executing a fio job. */ @@ -228,6 +232,7 @@ struct thread_data { double pareto_h; double gauss_dev; }; + double random_center; int error; int sig; int done; @@ -245,7 +250,7 @@ struct thread_data { void *iolog_buf; FILE *iolog_f; - unsigned long rand_seeds[FIO_RAND_NR_OFFS]; + uint64_t rand_seeds[FIO_RAND_NR_OFFS]; struct frand_state bsrange_state[DDIR_RWDIR_CNT]; struct frand_state verify_state; @@ -256,8 +261,10 @@ struct thread_data { struct frand_state buf_state_prev; struct frand_state dedupe_state; struct frand_state zone_state; + struct frand_state prio_state; struct zone_split_index **zone_state_index; + unsigned int num_open_zones; unsigned int verify_batch; unsigned int trim_batch; @@ -277,7 +284,6 @@ struct thread_data { * IO engine private data and dlhandle. */ void *io_ops_data; - void *io_ops_dlhandle; /* * Queue depth of io_u's that fio MIGHT do @@ -317,7 +323,7 @@ struct thread_data { */ uint64_t rate_bps[DDIR_RWDIR_CNT]; uint64_t rate_next_io_time[DDIR_RWDIR_CNT]; - unsigned long rate_bytes[DDIR_RWDIR_CNT]; + unsigned long long rate_bytes[DDIR_RWDIR_CNT]; unsigned long rate_blocks[DDIR_RWDIR_CNT]; unsigned long long rate_io_issue_bytes[DDIR_RWDIR_CNT]; struct timespec lastrate[DDIR_RWDIR_CNT]; @@ -351,6 +357,8 @@ struct thread_data { struct fio_sem *sem; uint64_t bytes_done[DDIR_RWDIR_CNT]; + uint64_t *thinktime_blocks_counter; + /* * State for random io, a bitmap of blocks done vs not done */ @@ -375,6 +383,7 @@ struct thread_data { unsigned int latency_qd_high; unsigned int latency_qd_low; unsigned int latency_failed; + unsigned int latency_stable_count; uint64_t latency_ios; int latency_end_run; @@ -436,6 +445,7 @@ struct thread_data { int first_error; struct fio_flow *flow; + unsigned long long flow_counter; /* * Can be overloaded by profiles @@ -458,10 +468,16 @@ struct thread_data { CUdevice cu_dev; CUcontext cu_ctx; CUdeviceptr dev_mem_ptr; -#endif +#endif }; +struct thread_segment { + struct thread_data *threads; + int shm_id; + int nr_threads; +}; + /* * when should interactive ETA output be generated */ @@ -505,10 +521,15 @@ enum { #define __fio_stringify_1(x) #x #define __fio_stringify(x) __fio_stringify_1(x) +#define REAL_MAX_JOBS 4096 +#define JOBS_PER_SEG 8 +#define REAL_MAX_SEG (REAL_MAX_JOBS / JOBS_PER_SEG) + extern bool exitall_on_terminate; extern unsigned int thread_number; extern unsigned int stat_number; -extern int shm_id; +extern unsigned int nr_segments; +extern unsigned int cur_segment; extern int groupid; extern int output_format; extern int append_terse_output; @@ -537,7 +558,15 @@ extern char *trigger_remote_cmd; extern long long trigger_timeout; extern char *aux_path; -extern struct thread_data *threads; +extern struct thread_segment segments[REAL_MAX_SEG]; + +static inline struct thread_data *tnumber_to_td(unsigned int tnumber) +{ + struct thread_segment *seg; + + seg = &segments[tnumber / JOBS_PER_SEG]; + return &seg->threads[tnumber & (JOBS_PER_SEG - 1)]; +} static inline bool is_running_backend(void) { @@ -552,8 +581,6 @@ static inline void fio_ro_check(const struct thread_data *td, struct io_u *io_u) !(io_u->ddir == DDIR_TRIM && !td_trim(td))); } -#define REAL_MAX_JOBS 4096 - static inline bool should_fsync(struct thread_data *td) { if (td->last_was_sync) @@ -660,8 +687,14 @@ extern const char *runstate_to_name(int runstate); */ #define FIO_REAP_TIMEOUT 300 -#define TERMINATE_ALL (-1U) -extern void fio_terminate_threads(unsigned int); +enum { + TERMINATE_NONE = 0, + TERMINATE_GROUP = 1, + TERMINATE_STONEWALL = 2, + TERMINATE_ALL = -1, +}; + +extern void fio_terminate_threads(unsigned int, unsigned int); extern void fio_mark_td_terminate(struct thread_data *); /* @@ -698,23 +731,13 @@ extern void lat_target_reset(struct thread_data *); * Iterates all threads/processes within all the defined jobs */ #define for_each_td(td, i) \ - for ((i) = 0, (td) = &threads[0]; (i) < (int) thread_number; (i)++, (td)++) + for ((i) = 0, (td) = &segments[0].threads[0]; (i) < (int) thread_number; (i)++, (td) = tnumber_to_td((i))) #define for_each_file(td, f, i) \ if ((td)->files_index) \ for ((i) = 0, (f) = (td)->files[0]; \ (i) < (td)->o.nr_files && ((f) = (td)->files[i]) != NULL; \ (i)++) -#define fio_assert(td, cond) do { \ - if (!(cond)) { \ - int *__foo = NULL; \ - fprintf(stderr, "file:%s:%d, assert %s failed\n", __FILE__, __LINE__, #cond); \ - td_set_runstate((td), TD_EXITED); \ - (td)->error = EFAULT; \ - *__foo = 0; \ - } \ -} while (0) - static inline bool fio_fill_issue_time(struct thread_data *td) { if (td->o.read_iolog_file || @@ -738,17 +761,9 @@ static inline bool option_check_rate(struct thread_data *td, enum fio_ddir ddir) return false; } -static inline bool __should_check_rate(struct thread_data *td) -{ - return (td->flags & TD_F_CHECK_RATE) != 0; -} - static inline bool should_check_rate(struct thread_data *td) { - if (!__should_check_rate(td)) - return false; - - return ddir_rw_sum(td->bytes_done) != 0; + return (td->flags & TD_F_CHECK_RATE) != 0; } static inline unsigned long long td_max_bs(struct thread_data *td) @@ -860,4 +875,14 @@ extern void check_trigger_file(void); extern bool in_flight_overlap(struct io_u_queue *q, struct io_u *io_u); extern pthread_mutex_t overlap_check; +static inline void *fio_memalign(size_t alignment, size_t size, bool shared) +{ + return __fio_memalign(alignment, size, shared ? smalloc : malloc); +} + +static inline void fio_memfree(void *ptr, size_t size, bool shared) +{ + return __fio_memfree(ptr, size, shared ? sfree : free); +} + #endif