X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=fio.h;h=fffec0014a4212e9183ce3bbeca963aa35492a43;hb=dee9b29bef5bc344815d7a53dda6bb21426f2bfa;hp=2a9eef45c7acf2a3532fd1c776df4a2c2e2772be;hpb=6447b4c297fefce060f6f3c44f7a5c34a869eaa3;p=fio.git diff --git a/fio.h b/fio.h index 2a9eef45..fffec001 100644 --- a/fio.h +++ b/fio.h @@ -172,8 +172,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. */ @@ -262,6 +260,7 @@ struct thread_data { 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; @@ -321,7 +320,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]; @@ -379,6 +378,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; @@ -440,6 +440,7 @@ struct thread_data { int first_error; struct fio_flow *flow; + unsigned long long flow_counter; /* * Can be overloaded by profiles @@ -466,6 +467,12 @@ struct thread_data { }; +struct thread_segment { + struct thread_data *threads; + int shm_id; + int nr_threads; +}; + /* * when should interactive ETA output be generated */ @@ -509,10 +516,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; @@ -541,7 +553,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) { @@ -556,8 +576,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) @@ -708,7 +726,7 @@ 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]; \