X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=fio.h;h=9d189eb878911fc2bb4a6e8c48e0384e2dacbef5;hp=9727f6c65556c4f937adad573cc2429a02ce6aa2;hb=35300d5fbbef6cf108882c8f1e403846a6371a2a;hpb=b4f5e72f1383499439c45acee627c022f06b6825 diff --git a/fio.h b/fio.h index 9727f6c6..9d189eb8 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" @@ -57,7 +59,9 @@ /* * "local" is pseudo-policy */ -#define MPOL_LOCAL MPOL_MAX +#ifndef MPOL_LOCAL +#define MPOL_LOCAL 4 +#endif #endif #ifdef CONFIG_CUDA @@ -135,6 +139,7 @@ enum { FIO_RAND_ZONE_OFF, FIO_RAND_POISSON2_OFF, FIO_RAND_POISSON3_OFF, + FIO_RAND_PRIO_CMDS, FIO_RAND_NR_OFFS, }; @@ -241,7 +246,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; @@ -252,8 +257,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; @@ -313,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]; @@ -371,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; @@ -399,6 +407,11 @@ struct thread_data { * For IO replaying */ struct flist_head io_log_list; + FILE *io_log_rfile; + unsigned int io_log_current; + unsigned int io_log_checkmark; + unsigned int io_log_highmark; + struct timespec io_log_highmark_time; /* * For tracking/handling discards @@ -427,6 +440,7 @@ struct thread_data { int first_error; struct fio_flow *flow; + unsigned long long flow_counter; /* * Can be overloaded by profiles @@ -449,7 +463,7 @@ struct thread_data { CUdevice cu_dev; CUcontext cu_ctx; CUdeviceptr dev_mem_ptr; -#endif +#endif }; @@ -496,7 +510,7 @@ enum { #define __fio_stringify_1(x) #x #define __fio_stringify(x) __fio_stringify_1(x) -extern int exitall_on_terminate; +extern bool exitall_on_terminate; extern unsigned int thread_number; extern unsigned int stat_number; extern int shm_id; @@ -505,7 +519,7 @@ extern int output_format; extern int append_terse_output; extern int temp_stall_ts; extern uintptr_t page_mask, page_size; -extern int read_only; +extern bool read_only; extern int eta_print; extern int eta_new_line; extern unsigned int eta_interval_msec; @@ -516,9 +530,10 @@ extern enum fio_cs fio_clock_source; extern int fio_clock_source_set; extern int warnings_fatal; extern int terse_version; -extern int is_backend; +extern bool is_backend; +extern bool is_local_backend; extern int nr_clients; -extern int log_syslog; +extern bool log_syslog; extern int status_interval; extern const char fio_version_string[]; extern char *trigger_file; @@ -529,23 +544,29 @@ extern char *aux_path; extern struct thread_data *threads; +static inline bool is_running_backend(void) +{ + return is_backend || is_local_backend; +} + extern bool eta_time_within_slack(unsigned int time); static inline void fio_ro_check(const struct thread_data *td, struct io_u *io_u) { - assert(!(io_u->ddir == DDIR_WRITE && !td_write(td))); + assert(!(io_u->ddir == DDIR_WRITE && !td_write(td)) && + !(io_u->ddir == DDIR_TRIM && !td_trim(td))); } #define REAL_MAX_JOBS 4096 -static inline int should_fsync(struct thread_data *td) +static inline bool should_fsync(struct thread_data *td) { if (td->last_was_sync) - return 0; + return false; if (td_write(td) || td->o.override_sync) - return 1; + return true; - return 0; + return false; } /* @@ -644,8 +665,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 *); /* @@ -689,16 +716,6 @@ extern void lat_target_reset(struct thread_data *); (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 || @@ -735,17 +752,17 @@ static inline bool should_check_rate(struct thread_data *td) return ddir_rw_sum(td->bytes_done) != 0; } -static inline unsigned int td_max_bs(struct thread_data *td) +static inline unsigned long long td_max_bs(struct thread_data *td) { - unsigned int max_bs; + unsigned long long max_bs; max_bs = max(td->o.max_bs[DDIR_READ], td->o.max_bs[DDIR_WRITE]); return max(td->o.max_bs[DDIR_TRIM], max_bs); } -static inline unsigned int td_min_bs(struct thread_data *td) +static inline unsigned long long td_min_bs(struct thread_data *td) { - unsigned int min_bs; + unsigned long long min_bs; min_bs = min(td->o.min_bs[DDIR_READ], td->o.min_bs[DDIR_WRITE]); return min(td->o.min_bs[DDIR_TRIM], min_bs); @@ -756,20 +773,23 @@ static inline bool td_async_processing(struct thread_data *td) return (td->flags & TD_F_NEED_LOCK) != 0; } +static inline bool td_offload_overlap(struct thread_data *td) +{ + return td->o.serialize_overlap && td->o.io_submit_mode == IO_MODE_OFFLOAD; +} + /* * We currently only need to do locking if we have verifier threads * accessing our internal structures too */ -static inline void td_io_u_lock(struct thread_data *td) +static inline void __td_io_u_lock(struct thread_data *td) { - if (td_async_processing(td)) - pthread_mutex_lock(&td->io_u_lock); + pthread_mutex_lock(&td->io_u_lock); } -static inline void td_io_u_unlock(struct thread_data *td) +static inline void __td_io_u_unlock(struct thread_data *td) { - if (td_async_processing(td)) - pthread_mutex_unlock(&td->io_u_lock); + pthread_mutex_unlock(&td->io_u_lock); } static inline void td_io_u_free_notify(struct thread_data *td) @@ -838,4 +858,17 @@ enum { extern void exec_trigger(const char *); 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