X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=fio.h;h=2103151d9b42b3b318cb16d4e3519bc6ed354da1;hp=0f6dfb6e6e8d93d8c35e97aaca5c5dd3d0c59044;hb=ce4d13ca162df4127ec3b5911553802c53396705;hpb=ae626d4ead6416adf464cf209cdf3e8b85d58190 diff --git a/fio.h b/fio.h index 0f6dfb6e..2103151d 100644 --- a/fio.h +++ b/fio.h @@ -27,6 +27,7 @@ #include "ioengines.h" #include "iolog.h" #include "helpers.h" +#include "minmax.h" #include "options.h" #include "profile.h" #include "fio_time.h" @@ -43,6 +44,7 @@ #include "io_u_queue.h" #include "workqueue.h" #include "steadystate.h" +#include "lib/nowarn_snprintf.h" #ifdef CONFIG_SOLARISAIO #include @@ -55,14 +57,16 @@ /* * "local" is pseudo-policy */ -#define MPOL_LOCAL MPOL_MAX +#ifndef MPOL_LOCAL +#define MPOL_LOCAL 4 +#endif #endif #ifdef CONFIG_CUDA #include #endif -struct fio_mutex; +struct fio_sem; /* * offset generator types @@ -78,7 +82,7 @@ enum { __TD_F_READ_IOLOG, __TD_F_REFILL_BUFFERS, __TD_F_SCRAMBLE_BUFFERS, - __TD_F_VER_NONE, + __TD_F_DO_VERIFY, __TD_F_PROFILE_OPS, __TD_F_COMPRESS, __TD_F_COMPRESS_LOG, @@ -99,7 +103,7 @@ enum { TD_F_READ_IOLOG = 1U << __TD_F_READ_IOLOG, TD_F_REFILL_BUFFERS = 1U << __TD_F_REFILL_BUFFERS, TD_F_SCRAMBLE_BUFFERS = 1U << __TD_F_SCRAMBLE_BUFFERS, - TD_F_VER_NONE = 1U << __TD_F_VER_NONE, + TD_F_DO_VERIFY = 1U << __TD_F_DO_VERIFY, TD_F_PROFILE_OPS = 1U << __TD_F_PROFILE_OPS, TD_F_COMPRESS = 1U << __TD_F_COMPRESS, TD_F_COMPRESS_LOG = 1U << __TD_F_COMPRESS_LOG, @@ -165,6 +169,8 @@ 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. */ @@ -199,7 +205,7 @@ struct thread_data { struct timespec iops_sample_time; volatile int update_rusage; - struct fio_mutex *rusage_sem; + struct fio_sem *rusage_sem; struct rusage ru_start; struct rusage ru_end; @@ -239,7 +245,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; @@ -342,7 +348,7 @@ struct thread_data { uint64_t this_io_bytes[DDIR_RWDIR_CNT]; uint64_t io_skip_bytes; uint64_t zone_bytes; - struct fio_mutex *mutex; + struct fio_sem *sem; uint64_t bytes_done[DDIR_RWDIR_CNT]; /* @@ -397,6 +403,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 @@ -404,8 +415,6 @@ struct thread_data { struct flist_head trim_list; unsigned long trim_entries; - struct flist_head next_rand_list; - /* * for fileservice, how often to switch to a new file */ @@ -469,7 +478,9 @@ enum { break; \ (td)->error = ____e; \ if (!(td)->first_error) \ - snprintf(td->verror, sizeof(td->verror), "file:%s:%d, func=%s, error=%s", __FILE__, __LINE__, (func), (msg)); \ + nowarn_snprintf(td->verror, sizeof(td->verror), \ + "file:%s:%d, func=%s, error=%s", \ + __FILE__, __LINE__, (func), (msg)); \ } while (0) @@ -494,7 +505,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; @@ -503,7 +514,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; @@ -514,9 +525,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; @@ -527,23 +539,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; } /* @@ -565,6 +583,7 @@ extern void fio_fill_default_options(struct thread_data *); extern int fio_show_option_help(const char *); extern void fio_options_set_ioengine_opts(struct option *long_options, struct thread_data *td); extern void fio_options_dup_and_init(struct option *); +extern char *fio_option_dup_subs(const char *); extern void fio_options_mem_dupe(struct thread_data *); extern void td_fill_rand_seeds(struct thread_data *); extern void td_fill_verify_state_seed(struct thread_data *); @@ -719,35 +738,30 @@ 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, - enum fio_ddir ddir) +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, DDIR_READ) && td->bytes_done[DDIR_READ]) - return true; - if (__should_check_rate(td, DDIR_WRITE) && td->bytes_done[DDIR_WRITE]) - return true; - if (__should_check_rate(td, DDIR_TRIM) && td->bytes_done[DDIR_TRIM]) - return true; + if (!__should_check_rate(td)) + return false; - return false; + 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); @@ -758,20 +772,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) @@ -840,4 +857,7 @@ 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; + #endif