X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=fio.h;h=963cf034c260a333f60eca33a365e280c400330f;hp=e96a4dd1dcd1058071e20502d58003be38e88dae;hb=e5aaf1e677d1413125ffaf7aae48b1e8f4ce9ebc;hpb=9b87f09b1d3cac320c2da5758c1e74d4b4c0fadd diff --git a/fio.h b/fio.h index e96a4dd1..963cf034 100644 --- a/fio.h +++ b/fio.h @@ -25,7 +25,7 @@ #include "debug.h" #include "file.h" #include "io_ddir.h" -#include "ioengine.h" +#include "ioengines.h" #include "iolog.h" #include "helpers.h" #include "options.h" @@ -35,12 +35,15 @@ #include "oslib/getopt.h" #include "lib/rand.h" #include "lib/rbtree.h" +#include "lib/num2str.h" #include "client.h" #include "server.h" #include "stat.h" #include "flow.h" +#include "io_u.h" #include "io_u_queue.h" #include "workqueue.h" +#include "steadystate.h" #ifdef CONFIG_SOLARISAIO #include @@ -56,6 +59,10 @@ #define MPOL_LOCAL MPOL_MAX #endif +#ifdef CONFIG_CUDA +#include +#endif + /* * offset generator types */ @@ -73,7 +80,7 @@ enum { TD_F_VER_NONE = 1U << 5, TD_F_PROFILE_OPS = 1U << 6, TD_F_COMPRESS = 1U << 7, - TD_F_NOIO = 1U << 8, + TD_F_RESERVED = 1U << 8, /* not used */ TD_F_COMPRESS_LOG = 1U << 9, TD_F_VSTATE_SAVED = 1U << 10, TD_F_NEED_LOCK = 1U << 11, @@ -98,6 +105,8 @@ enum { FIO_DEDUPE_OFF, FIO_RAND_POISSON_OFF, FIO_RAND_ZONE_OFF, + FIO_RAND_POISSON2_OFF, + FIO_RAND_POISSON3_OFF, FIO_RAND_NR_OFFS, }; @@ -109,11 +118,17 @@ enum { RATE_PROCESS_POISSON = 1, }; +enum { + F_ADV_NONE = 0, + F_ADV_TYPE, + F_ADV_RANDOM, + F_ADV_SEQUENTIAL, +}; + /* * Per-thread/process specific data. Only used for the network client * for now. */ -struct sk_out; void sk_out_assign(struct sk_out *); void sk_out_drop(void); @@ -134,7 +149,7 @@ struct thread_data { unsigned int thread_number; unsigned int subjob_number; unsigned int groupid; - struct thread_stat ts; + struct thread_stat ts __attribute__ ((aligned)); int client_type; @@ -197,8 +212,6 @@ struct thread_data { void *iolog_buf; FILE *iolog_f; - char *sysfs_root; - unsigned long rand_seeds[FIO_RAND_NR_OFFS]; struct frand_state bsrange_state; @@ -225,6 +238,7 @@ struct thread_data { * to any of the available IO engines. */ struct ioengine_ops *io_ops; + int io_ops_init; /* * IO engine private data and dlhandle. @@ -269,13 +283,13 @@ struct thread_data { * Rate state */ uint64_t rate_bps[DDIR_RWDIR_CNT]; - unsigned long rate_next_io_time[DDIR_RWDIR_CNT]; + uint64_t rate_next_io_time[DDIR_RWDIR_CNT]; unsigned long rate_bytes[DDIR_RWDIR_CNT]; unsigned long rate_blocks[DDIR_RWDIR_CNT]; - unsigned long rate_io_issue_bytes[DDIR_RWDIR_CNT]; + unsigned long long rate_io_issue_bytes[DDIR_RWDIR_CNT]; struct timeval lastrate[DDIR_RWDIR_CNT]; - int64_t last_usec; - struct frand_state poisson_state; + int64_t last_usec[DDIR_RWDIR_CNT]; + struct frand_state poisson_state[DDIR_RWDIR_CNT]; /* * Enforced rate submission/completion workqueue @@ -311,6 +325,7 @@ struct thread_data { struct timeval start; /* start of this loop */ struct timeval epoch; /* time job was started */ + unsigned long long unix_epoch; /* Time job was started, unix epoch based. */ struct timeval last_issue; long time_offset; struct timeval tv_cache; @@ -394,7 +409,21 @@ struct thread_data { void *pinned_mem; + struct steadystate_data ss; + char verror[FIO_VERROR_SIZE]; + +#ifdef CONFIG_CUDA + /* + * for GPU memory management + */ + int gpu_dev_cnt; + int gpu_dev_id; + CUdevice cu_dev; + CUcontext cu_ctx; + CUdeviceptr dev_mem_ptr; +#endif + }; /* @@ -451,7 +480,6 @@ extern int read_only; extern int eta_print; extern int eta_new_line; extern unsigned long done_secs; -extern char *job_section; extern int fio_gtod_offload; extern int fio_gtod_cpu; extern enum fio_cs fio_clock_source; @@ -476,13 +504,13 @@ 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))); } -#define REAL_MAX_JOBS 2048 +#define REAL_MAX_JOBS 4096 static inline int should_fsync(struct thread_data *td) { if (td->last_was_sync) return 0; - if (td_write(td) || td_rw(td) || td->o.override_sync) + if (td_write(td) || td->o.override_sync) return 1; return 0; @@ -508,13 +536,11 @@ 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 void fio_options_mem_dupe(struct thread_data *); -extern void options_mem_dupe(void *data, struct fio_option *options); extern void td_fill_rand_seeds(struct thread_data *); extern void td_fill_verify_state_seed(struct thread_data *); extern void add_job_opts(const char **, int); -extern char *num2str(uint64_t, int, int, int, int); extern int ioengine_load(struct thread_data *); -extern int parse_dryrun(void); +extern bool parse_dryrun(void); extern int fio_running_or_pending_io_threads(void); extern int fio_set_fd_nonblocking(int, const char *); extern void sig_show_status(int sig); @@ -564,17 +590,20 @@ enum { static inline enum fio_ioengine_flags td_ioengine_flags(struct thread_data *td) { - return (td->flags >> TD_ENG_FLAG_SHIFT) & TD_ENG_FLAG_MASK; + return (enum fio_ioengine_flags) + ((td->flags >> TD_ENG_FLAG_SHIFT) & TD_ENG_FLAG_MASK); } static inline void td_set_ioengine_flags(struct thread_data *td) { - td->flags |= (td->io_ops->flags << TD_ENG_FLAG_SHIFT); + td->flags = (~(TD_ENG_FLAG_MASK << TD_ENG_FLAG_SHIFT) & td->flags) | + (td->io_ops->flags << TD_ENG_FLAG_SHIFT); } -static inline bool td_ioengine_flagged(struct thread_data *td, unsigned int val) +static inline bool td_ioengine_flagged(struct thread_data *td, + enum fio_ioengine_flags flags) { - return ((td->flags >> TD_ENG_FLAG_SHIFT) & val) != 0; + return ((td->flags >> TD_ENG_FLAG_SHIFT) & flags) != 0; } extern void td_set_runstate(struct thread_data *, int); @@ -586,7 +615,7 @@ extern const char *runstate_to_name(int runstate); * Allow 60 seconds for a job to quit on its own, otherwise reap with * a vengeance. */ -#define FIO_REAP_TIMEOUT 60 +#define FIO_REAP_TIMEOUT 300 #define TERMINATE_ALL (-1U) extern void fio_terminate_threads(unsigned int); @@ -601,19 +630,16 @@ extern int __must_check allocate_io_mem(struct thread_data *); extern void free_io_mem(struct thread_data *); extern void free_threads_shm(void); +#ifdef FIO_INTERNAL +#define PTR_ALIGN(ptr, mask) \ + (char *) (((uintptr_t) (ptr) + (mask)) & ~(mask)) +#endif + /* * Reset stats after ramp time completes */ extern void reset_all_stats(struct thread_data *); -/* - * blktrace support - */ -#ifdef FIO_HAVE_BLKTRACE -extern int is_blktrace(const char *, int *); -extern int load_blktrace(struct thread_data *, const char *, int); -#endif - extern int io_queue_event(struct thread_data *td, struct io_u *io_u, int *ret, enum fio_ddir ddir, uint64_t *bytes_issued, int from_verify, struct timeval *comp_time); @@ -625,6 +651,9 @@ extern void lat_target_check(struct thread_data *); extern void lat_target_init(struct thread_data *); 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)++) #define for_each_file(td, f, i) \ @@ -643,17 +672,17 @@ extern void lat_target_reset(struct thread_data *); } \ } while (0) -static inline int fio_fill_issue_time(struct thread_data *td) +static inline bool fio_fill_issue_time(struct thread_data *td) { if (td->o.read_iolog_file || !td->o.disable_clat || !td->o.disable_slat || !td->o.disable_bw) - return 1; + return true; - return 0; + return false; } -static inline int __should_check_rate(struct thread_data *td, - enum fio_ddir ddir) +static inline bool __should_check_rate(struct thread_data *td, + enum fio_ddir ddir) { struct thread_options *o = &td->o; @@ -662,23 +691,21 @@ static inline int __should_check_rate(struct thread_data *td, */ if (o->rate[ddir] || o->ratemin[ddir] || o->rate_iops[ddir] || o->rate_iops_min[ddir]) - return 1; + return true; - return 0; + return false; } -static inline int should_check_rate(struct thread_data *td) +static inline bool should_check_rate(struct thread_data *td) { - int ret = 0; - - if (td->bytes_done[DDIR_READ]) - ret |= __should_check_rate(td, DDIR_READ); - if (td->bytes_done[DDIR_WRITE]) - ret |= __should_check_rate(td, DDIR_WRITE); - if (td->bytes_done[DDIR_TRIM]) - ret |= __should_check_rate(td, DDIR_TRIM); - - return ret; + if (td->bytes_done[DDIR_READ] && __should_check_rate(td, DDIR_READ)) + return true; + if (td->bytes_done[DDIR_WRITE] && __should_check_rate(td, DDIR_WRITE)) + return true; + if (td->bytes_done[DDIR_TRIM] && __should_check_rate(td, DDIR_TRIM)) + return true; + + return false; } static inline unsigned int td_max_bs(struct thread_data *td)